请求正文在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我的数据。 在谷歌Chrome开发人员工具,我可以看到标题和一切发送好,但我不能看到它在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.json
, parse.form
或parse.text
来replace它
koa按照您初始化的顺序使用中间件。 所以如果你在bodyparser之前插入路由器,它将无法工作。 因为你的请求在到达路由器中间件之前不会传递给parsing器,所以请求不会被parsing,koa会忽略request.body。 所以sorting真的很重要。
解
根据评论,对我来说正确的是this.request.body
和this.req.body
是不正确的。