egg实现服务之间上传文件

直接请求

可直接在后端模拟 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请求。

推荐阅读更多精彩内容