直接请求
可直接在后端模拟 form-data 上传文件,请求第三方服务,上代码:
const stream = await this.ctx.getFileStream()
const form = new FormStream()
Object.keys(stream.fields).forEach(key => form.field(key, stream.fields[key])) // 用户附带参数
form.stream(stream.fieldname, stream, stream.filename)
const res = await this.app.curl(`${url}`, {
method: 'POST',
dataType: 'json',
headers: {
...form.headers(),
},
stream: form,
timeout: 8000,
})
// ... console.log(res)
能上传成功的前提是 对方服务端接口必须支持文件流
代理转发
需要安装插件 @eggjs/http-proxy
npm i @eggjs/http-proxy --save
配置 plugin.js
// {app_root}/config/plugin.js
exports.httpProxy = {
enable: true,
package: '@eggjs/http-proxy',
};
service:
const res = await this.ctx.proxyRequest('xxx.com', {
rewrite(urlObj) {
urlObj.pathname = '/upload'
return urlObj
},
withCredentials: true, // if true, will send cookie when cors
headers: {
cookie, // 可不携带,视目标接口而定
},
})
// console.log(res)
// 控制台打印如下视为成功
// [-/::1/-/198ms POST /api/v1/dw/upload] forward:success, status:200, targetUrl:http://xxx.com/upload
这种方式还可以实现node做中间层代理转发的目的,包括任何http请求。