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

使用有效的JSON创buildPOST请求时,bodyParser会正确parsingPOST请求的正文。 但是,如果我提交一个无效的JSONstring作为正文,我收到错误:

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

所以,在parsing正文的过程中,body parser似乎失败了。 不过,我想赶上这个失败,并返回一个错误。 我不确定我能做些什么来抓住它,所以任何帮助,将不胜感激。 谢谢。

这是在connect.js bodyParser中间件 。 它做一个尝试/抓住,然后再打电话(犯错)。 你应该能够捕获这个错误,并使用app.error()callback钩子处理额外的自定义代码。 http://expressjs.com/guide.html#error-handling

出于某种原因,使用express / connect时,JSON.parse不会抛出exception,这就是为什么你的error handling程序不会触发。

我已经用快递logging了一个问题,以了解发生了什么,但在此期间,您可以使用此解决方法:

 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的作者是不熟悉的,所以我想知道是否是另一个库引起的。 将不得不逐个拆除我的代码,以找出引入此行为的位置。

试着把你的

app.use(express.bodyParser()); 在app.use(express.errorHandler(…))之后

为我解决了它。

您也可以修改以下代码来pipe理错误

 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')); } }); }; 

bodyParser必须在app.use(app.router)之上,与Perki的error handling程序的相对位置无关紧要