如何在路由处理程序中访问回调函数内的ctx,请求和响应对象?

时间:2016-01-06 16:21:41

标签: callback promise koa

如何在异步函数调用的路由处理程序中访问回调函数内的ctxrequestresponse对象,例如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

1 个答案:

答案 0 :(得分:0)

您可以选择退出使用this.respond = false的Koa内置响应处理,这样您就可以像在Express中一样编写和发送响应。

文档:https://github.com/koajs/koa/blob/master/docs/api/context.md#ctxrespond

否则,您必须使用yield。正是在某些异步逻辑运行之前停放处理程序的原因。

FWIW,在承诺中包装基于回调的异步逻辑几乎总是优越的,然后在你的路线中产生它。我还没有遇到this.respond = false的用例。