问答

Koa 通过 stream 转发数据, 能否获取并带上 Response Headers?

作者:admin 2021-05-14 我要评论

是这样的. 目前有一个 get 请求接口, 接收前端的请求, 然后签名生成 token , 去 cos 文件服务器下载文件返回给前端. 原来是直接重定向到对应的 cos 资源服务器下...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

是这样的.

目前有一个 get 请求接口, 接收前端的请求, 然后签名生成 token, 去 cos 文件服务器下载文件返回给前端.

原来是直接重定向到对应的 cos 资源服务器下载, 没有问题.

但是现在由于要接入银行, 对外网网络访问比较严格, 不太希望多开放一个白名单. 所以我需要请求 cos 资源, 然后转发文件数据.

但是如果我通过:

const res = await request.get(cosurl);
ctx.body = res.body;
ctx.set(xxx, res.response.headers['xxxxx']);

这种方式请求完了转发, 当文件比较大的时候, 会下载很慢, 而且存在内存也是一个隐患.

而如果是:

ctx.set('content-disposition', `attachment; filename=${filename}`);
ctx.set('content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
ctx.body = request.get(cosUrl);

通过 stream 转发, 虽然我可以事先知道文件名, 文件格式. 但是拿不到文件大小 Content-Length, 而且当特殊情况, 比如请求失败, 签名失败的时候, 由于我写死了文件类型, 就会下载一个 内容为报错信息 的文件.

所以我想, 能否通过 stream 转发的时候, 也能获取到 res.response.headers, 然后返回给前端呢?

###

解决了, 自问自答吧.

ctx.body = request.get(cosUrl).on('response', response => {
  for (const key in response.header) {
    ctx.set(key, response.header[key]);
  }
});

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 请问下prometheus怎么进行自定义的按业

    请问下prometheus怎么进行自定义的按业

  • 节流函数为什么,点击无效,监听窗口大

    节流函数为什么,点击无效,监听窗口大

  • express访问静态资源失败

    express访问静态资源失败

  • IE 浏览器下 match 方法报错

    IE 浏览器下 match 方法报错

腾讯云代理商
海外云服务器