我向我的koajs服务器发出以下请求:
$.ajax({
type : 'PUT', // this.request.body undefined server side
// type : 'POST', // this.request.body all good server side
url : url,
data : body,
dataType : 'json'
})
但是在服务器端this.request.body
始终未定义。
如果我将请求类型更改为POST,则可以正常工作。
有什么想法吗?
修改
我正在使用koa-route
。
编辑2
刚刚意识到我正在使用koa-body-parser
,这可能更具相关性。
答案 0 :(得分:1)
尝试使用koa-body解析器:
const bodyParser = require('koa-bodyparser')
app.use(bodyParser())
我认为koa-router将解析典型的请求内容,url params,表单等。如果要解析包含JSON对象的请求的主体,则需要应用中间件(如alex提到的那样)。
另外,请检查您是否正在使用有效的JSON。
看看这个Koa-bodyparser:
/**
* @param [Object] opts
* - {String} jsonLimit default '1mb'
* - {String} formLimit default '56kb'
* - {string} encoding default 'utf-8'
*/
return function *bodyParser(next) {
if (this.request.body !== undefined) {
return yield* next;
}
if (this.is('json')) {
this.request.body = yield parse.json(this, jsonOpts);
} else if (this.is('urlencoded')) {
this.request.body = yield parse.form(this, formOpts);
} else {
this.request.body = null;
}
yield* next;
};
看起来JSON数量限制为1mb。然后到co-body / lib / json.js
module.exports = function(req, opts){
req = req.req || req;
opts = opts || {};
// defaults
var len = req.headers['content-length'];
if (len) opts.length = ~~len;
opts.encoding = opts.encoding || 'utf8';
opts.limit = opts.limit || '1mb';
return function(done){
raw(req, opts, function(err, str){
if (err) return done(err);
try {
done(null, JSON.parse(str));
} catch (err) {
err.status = 400;
err.body = str;
done(err);
}
});
}
};