用koa避免`this`

时间:2015-03-18 15:29:16

标签: koa

在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: "/"
});

和其他形式的绑定,但我想检查一下,通过设计,这是唯一的方法。

2 个答案:

答案 0 :(得分:5)

访问this

Koa运行每个中间件,this绑定到Context。访问请求和响应需要通过上下文this

这绝对是设计的。如果需要,在变量中存储对上下文的引用:

var self = this
//or
var ctx = this

或使用Function.prototype.bind

myArray.forEach( function( item ){
    console.log( this.url )
}.bind( this ) )

Koa

的设计

我会解释another answerthe Koa FAQ

Express的外观和感觉非常类似于标准节点的做事方式&#34 ;;它遵循http模块设置的示例。

另一方面,Koa意在取代节点方式"。作者选择实现自己的处理请求和中间件的理想。 Koa在this.requestthis.response中公开了自己的请求和响应版本,将原始节点reqres保留在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(和绑定上下文)阻碍了表达性......也许我错了,但有箭头函数就是一个例子