使用有效的JSON创建POST请求时,bodyParser会正确解析POST请求的正文。但是,如果我提交了一个无效的JSON字符串作为正文,我收到错误:
SyntaxError: Unexpected token ILLEGAL
at parse (native)
at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15)
...
因此,在解析身体时似乎身体解析器失败了。但是,我想抓住这个失败并返回错误。我不确定我能做些什么才能抓住它,所以任何帮助都会受到赞赏。感谢。
答案 0 :(得分:2)
这是connect.js bodyParser middleware。它会做一个try / catch然后调用next(错误)。您应该能够捕获此错误并使用app.error()
回调挂钩处理其他自定义代码。 http://expressjs.com/guide.html#error-handling
答案 1 :(得分:1)
出于某种原因,当使用express / connect时,JSON.parse不会抛出异常,这就是你的错误处理程序不会触发的原因。
我logged an issue with express了解发生了什么,但在此期间您可以使用此解决方法:
express.bodyParser.parse['application/json'] = function(data) {
var result = JSON.parse(data)
if (typeof result != 'object') {
throw new Error('Problems parsing JSON')
}
return result;
}
app.use(express.bodyParser());
更新:这个问题对于express的作者并不熟悉,所以我想知道它是否是导致它的另一个库。将不得不一块一块地拆除我的代码,以弄清楚这种行为的引入位置。
答案 2 :(得分:1)
尝试把你的
app.use(express.bodyParser()); 后 app.use(express.errorHandler(...))
为我解决了。
您还可以调整以下代码来管理错误
express.bodyParser.parse['application/json'] = function(req, options, fn){
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function(){
try {
req.body = buf.length
? JSON.parse(buf)
: {};
fn();
} catch (err){
fn(new Error('Problems parsing JSON'));
}
});
};
答案 3 :(得分:0)
bodyParser必须高于app.use(app.router),与Perki的错误处理程序的相对位置无关紧要