在Koa中,我们可以在不使用预先绑定的这个的情况下访问 Koa Context 吗?
例如:this
已分配给 Koa上下文:
app.use(function *(next) {
this.url;
})
但是有类似的东西:
app.use(function *(next, ctx) {
ctx.url;
})
为什么呢?假设我们使用箭头函数,this
将不是koa上下文:
app.use( function *( next ) {
console.log( this.url ); // logs: "/"
( () => console.log( this.url ) )(); // logs: "undefined"
});
我知道我们可以做到:
app.use( function *( next ) {
var ctx = this;
( () => console.log( ctx.url ) )(); // logs: "/"
});
和其他形式的绑定,但我想检查一下,通过设计,这是唯一的方法。
答案 0 :(得分:5)
this
Koa运行每个中间件,this
绑定到Context。访问请求和响应需要通过上下文this
。
这绝对是设计的。如果需要,在变量中存储对上下文的引用:
var self = this
//or
var ctx = this
myArray.forEach( function( item ){
console.log( this.url )
}.bind( this ) )
我会解释another answer和the Koa FAQ。
Express的外观和感觉非常类似于标准节点的做事方式&#34 ;;它遵循http
模块设置的示例。
另一方面,Koa意在取代节点方式"。作者选择实现自己的处理请求和中间件的理想。 Koa在this.request
和this.response
中公开了自己的请求和响应版本,将原始节点req
和res
保留在this.req
和{分别为{1}}。
这些例子应该引起不同的心态。
Express方法非常基于行动。
this.res
Koa方法非常基于事实"。
app.use( function( req, res ){
//SEND the response
res.send( 'some text' )
})
因此,似乎不是以程序方式将app.use( function*( next ){
//The response IS this
this.body = 'some text'
})
和req
传递给函数,而是将Koa公开为请求的属性(或"事实")。
答案 1 :(得分:3)
新答案:
现在可以在koa v2中找到。
旧答案:
这不可能。中间件通过co提供的thunks
(单个参数函数)提供给应用程序。
截至撰写(2015年4月),不推荐使用 co </ strong>中的thunk。因此,Koa与他们保持联系或转向承诺是未知的。我的2p,来自其他函数式语言,thunk(和绑定上下文)阻碍了表达性......也许我错了,但有箭头函数就是一个例子