koa是如何处理body?

clipboard.png
看图,我用是request库,而request请求github的接口,然后设置给ctx.body,这里,我有个疑问,request不是异步的吗?为什么这里就可以直接赋值给ctx.body呢?而且这样写,你调用接口,确实能正确返回结果。

clipboard.png

阅读 4.6k
2 个回答

这里能顺利返回,有运气成分在里面,不建议这样使用。

为什么能成功

首先,request(xxx)返回的是个Stream实例

var request = require('request');
var re = request('xxx'); // 替换成实际资源
console.log( body instanceof Stream ); // 打印 true

然后,当ctx.body是Stream实例时,koa做了特殊处理,采用了pipe,因此虽然request(xx)是异步的,但还是能成功返回的原因。

if (body instanceof Stream) return body.pipe(res); // koa的源代码

更好的姿势

await asyncFn() 来获取结果,可以自己封装这里的asyncFn,也可以采用官方的版本。

正确返回结果是什么意思
request返回的是个Request对象而不是接口的返回值吧,如果你没对request做任何处理,你的data应该是个有 '_tunnel', 'headers', 'setHeader', 'hasHeader', 'getHeader',这些属性的Request对象。

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