在Express中捕获非法JSON POST数据?

时间:2011-09-20 00:42:37

标签: node.js express

使用有效的JSON创建POST请求时,bodyParser会正确解析POST请求的正文。但是,如果我提交了一个无效的JSON字符串作为正文,我收到错误:

SyntaxError: Unexpected token ILLEGAL
at parse (native)
at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15)
...

因此,在解析身体时似乎身体解析器失败了。但是,我想抓住这个失败并返回错误。我不确定我能做些什么才能抓住它,所以任何帮助都会受到赞赏。感谢。

4 个答案:

答案 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的错误处理程序的相对位置无关紧要