如何在异步函数调用的路由处理程序中访问回调函数内的ctx
,request
和response
对象,例如db查询,而不是{{1} } ING?在以下两个替代方案中,yield
无法分配给this.body
。 koa.js在这里的例子中使用。内部路由处理程序是一个数据库查询,与回调异步。
我收到错误koa.js抱怨像在设置后无法设置标题,我理解Monsieur Koa已经设置了。当用户没有明确提供它们时,这是完全可以接受的,他们更愿意将它们设置为可接受的默认值并发送data
而不是抛出错误。
但是我的异步操作完成后我无法设置标题。
备选方案:
1。通过回调函数中的变量携带http response
this
2。使用箭头回调函数让publicRouter.get('/to1', function (next){
var self = this;
db.query('select username from users where username=${username}', {username:'isik'})
.then(function(data) {
console.log(data);
self.body = data;
})
.catch(function(error) {
console.log(error);
});
});
未绑定到箭头函数“this
:
this
要谨慎,publicRouter.get('/to1', function (next){
db.query('select username from users where username=${username}', {username:'isik'})
.then( data => {
console.log(data);
this.body = data;
})
.catch( error => {
console.log(error);
});
});
它有效,这不是我在这里要求的。
yield
答案 0 :(得分:0)
您可以选择退出使用this.respond = false
的Koa内置响应处理,这样您就可以像在Express中一样编写和发送响应。
文档:https://github.com/koajs/koa/blob/master/docs/api/context.md#ctxrespond
否则,您必须使用yield
。正是在某些异步逻辑运行之前停放处理程序的原因。
FWIW,在承诺中包装基于回调的异步逻辑几乎总是优越的,然后在你的路线中产生它。我还没有遇到this.respond = false
的用例。