koa 设置response header字段transfer-encoding为chunked之后客户端收不到响应

koa使用ctx.set设置transfer-encoding为chunked之后,客户端接受不到ctx.body的返回值,烦请各位解答一下,谢谢🙏

简化代码如下:

app.use(async (ctx) => {
  if (ctx.request.path === '/') {
    ctx.set('transfer-encoding', 'chunked');
    
    return ctx.body = '123';
  }
});

使用postman测试:
图片描述

阅读 6.6k
1 个回答

试了一下, 发现应该是 koa 自动带上了 content-length 导致的.
在chrome中, 不会发生解析失败的问题, 但是在 postman 客户端, 和 node http 模块 get 时, 会发生解析错误.

试了一下, 在 koa 源码, response 文件中,

set(field, val) {
    if (this.headerSent) return;
    if (2 == arguments.length) {
      if (Array.isArray(val)) val = val.map(v => typeof v === 'string' ? v : String(v));
      else if (typeof val !== 'string') val = String(val);
      this.res.setHeader(field, val);
    } else {
      for (const key in field) {
        this.set(key, field[key]);
      }
    }
  },

临时改成了

  set(field, val) {
    if (this.headerSent) return;
    if ((this.header['transfer-encoding'] || this.header['Transfer-Encoding']) && field === 'Content-Length') return  // 有了 transfer-encoding header 就不再添加 content-length
    if (2 == arguments.length) {
    // .....

然后再运行问题中的代码, 用 postman 或者 nodejs http.get 测试, 都能正常返回.
至于, 为什么 koa 要自动带上 content-length 不做判断, 和如何解决这种情况或者说有没有必要解决...希望有知道的大佬补充一下orz

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题