在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ koa是如何處理body

koa是如何處理body

clipboard.png
看圖,我用是request庫(kù),而request請(qǐng)求github的接口,然后設(shè)置給ctx.body,這里,我有個(gè)疑問(wèn),request不是異步的嗎?為什么這里就可以直接賦值給ctx.body呢?而且這樣寫(xiě),你調(diào)用接口,確實(shí)能正確返回結(jié)果。

clipboard.png

回答
編輯回答
失心人

正確返回結(jié)果是什么意思
request返回的是個(gè)Request對(duì)象而不是接口的返回值吧,如果你沒(méi)對(duì)request做任何處理,你的data應(yīng)該是個(gè)有 '_tunnel', 'headers', 'setHeader', 'hasHeader', 'getHeader',這些屬性的Request對(duì)象。

2018年7月6日 02:22
編輯回答
練命

這里能順利返回,有運(yùn)氣成分在里面,不建議這樣使用。

為什么能成功

首先,request(xxx)返回的是個(gè)Stream實(shí)例

var request = require('request');
var re = request('xxx'); // 替換成實(shí)際資源
console.log( body instanceof Stream ); // 打印 true

然后,當(dāng)ctx.body是Stream實(shí)例時(shí),koa做了特殊處理,采用了pipe,因此雖然request(xx)是異步的,但還是能成功返回的原因。

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

更好的姿勢(shì)

await asyncFn() 來(lái)獲取結(jié)果,可以自己封裝這里的asyncFn,也可以采用官方的版本。

2018年6月11日 09:34