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

Node.js 在Express中捕获非法JSON POST数据?,node.js,express,Node.js,Express,使用有效JSON创建POST请求时,bodyParser会正确解析POST请求的主体。但是,如果我提交一个无效的JSON字符串作为正文,我会收到错误: SyntaxError: Unexpected token ILLEGAL at parse (native) at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15) ... SyntaxError:意外标记非法 在解析时(本机) 在Incom

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

SyntaxError: Unexpected token ILLEGAL
at parse (native)
at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15)
...
SyntaxError:意外标记非法
在解析时(本机)
在IncomingMessage上。(/home/../middleware/bodyParser.js:69:15)
...

因此,在解析主体的过程中,主体解析器似乎失败了。但是,我希望捕获此失败并返回一个错误。我不知道我能做些什么来抓住它,所以任何帮助都将不胜感激。谢谢。

这是在。它确实执行了try/catch,然后调用next(err)。您应该能够捕获此错误,并使用
app.error()
回调挂钩处理其他自定义代码

出于某种原因,在使用express/connect时,JSON.parse不会引发异常,这就是错误处理程序不会触发的原因

我必须找出发生了什么,但在此期间,您可以使用以下解决方法:

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(…)

帮我解决了

您还可以修改以下代码来管理错误

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

嘿,Peter,谢谢你的回复。不幸的是,我试过了,但没有用。似乎永远不会执行app.error。我试过:
app.error(函数(err,req,res,next){console.log(“err”);}),但它没有被执行。对于我的app.configure For development,我将其设置为
app.use(express.errorHandler({dumpExceptions:true,showStack:true}))。我正在运行节点0.4.9、连接1.7.1和express 2.4.6。有什么想法吗?再次感谢。现在请尝试注释express errorHandler,并在配置app.use路由后拨打app.error。但除此之外,我不确定为什么不会调用
app.error
。出于某种原因,在使用express/connect时,JSON.parse不会引发异常,这就是为什么您的错误处理程序不会触发。我正在研究解决这个问题的方法。我发现这个问题与express无关。奇怪的你能找出你案例中的故障代码吗?