请求正文在KOA中未定义

我有KOA像下面这样:

var koa = require('koa'), bodyParser = require('koa-body-parser'), router = require('koa-router'), app = koa(); app.use(router(app)); app.use(bodyParser()); app.post('http://localhost/get',getit); function *getit(){ console.log(this.req.body); //undefined } 

然后通过jquery ajax发送一个post reqeust:

  var xhr = $.ajax({ type: 'POST', dataType: 'json', contentType: 'application/json', url: 'http://localhost/getit', data: {"name":"me"}, success: function(response) { } }); 

但在koa和this.req我无法find我的数据。 在谷歌C​​hrome开发人员工具,我可以看到标题和一切发送好,但我不能看到它在koa。

更新

正确的是:

  function *getit(){ console.log(this.request.body); //undefined } 

有趣的是,我遇到了同样的错误,但我的问题是app.use()语句的sorting。 下面的不适合我,并返回undefined'this.request.body:

 var koa = require('koa'); var router = require('koa-router'); var bodyParser = require('koa-body-parser'); var app = koa(); app.use(router(app)); app.use(bodyParser()); app.post('/login', function *() { this.response.body = this.request.body; }); app.listen(3000); 

但是,如果我颠倒了两个app.use()语句的顺序如下:

 app.use(bodyParser()); app.use(router(app)); 

然后我可以看到this.request.body中的元素。 我正在使用koa v0.5.5,koa-body-parser v1.0.0,koa-router v3.1.2和node v0.11.12。

我将使用co-body模块(与koa-body-parser内部使用的模块相同)。 代码应该如下所示:

 var koa = require('koa'); var _ = require('koa-route'); var parse = require('co-body'); var app = koa(); app.use(function* (next) { this.req.body = yield parse(this); yield next; }); app.use(_.post('/login', function* () { this.body = this.req.body; })); app.listen(3000); 

var body = yield parse(this); 行是这样做的,parsing方法会尝试parsing任何请求,但是如果你需要更多的控制,你可以用parse.jsonparse.formparse.text来replace它

koa按照您初始化的顺序使用中间件。 所以如果你在bodyparser之前插入路由器,它将无法工作。 因为你的请求在到达路由器中间件之前不会传递给parsing器,所以请求不会被parsing,koa会忽略request.body。 所以sorting真的很重要。

根据评论,对我来说正确的是this.request.bodythis.req.body是不正确的。