【问题标题】:Catching Illegal JSON POST Data in Express?在 Express 中捕获非法 JSON POST 数据?
【发布时间】:2013-02-07 12:11:55
【问题描述】:

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

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

因此,在正文的解析过程中,正文解析器似乎失败了。但是,我想抓住这个失败并返回一个错误。我不确定我能做些什么来抓住它,所以任何帮助都将不胜感激。谢谢。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    这是在connect.js bodyParser middleware 中。它确实做了一个 try/catch,然后调用 next(err)。您应该能够使用app.error() 回调挂钩捕获此错误并处理其他自定义代码。 http://expressjs.com/guide.html#error-handling

    【讨论】:

    • 嗨,彼得,感谢您的回复。不幸的是,我试过没有用。似乎 app.error 从未被执行。我试过:app.error(function(err,req,res,next) { console.log("ERR"); });,但它没有被执行。对于我用于开发的 app.configure,我将其设置为 app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));。我正在运行节点 0.4.9,连接 1.7.1,并表达 2.4.6。有任何想法吗?再次感谢。
    • 现在尝试注释掉 express errorHandler 并在你的 app.use 路由配置好之后放置你的 app.error 调用。但除此之外,我不确定为什么 app.error 不会被调用。
    • 由于某种原因,当使用 express/connect 时,JSON.parse 不会引发异常,这就是您的错误处理程序不会触发的原因。我正在研究解决这个问题的方法。
    【解决方案2】:

    由于某种原因,在使用 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的作者不熟悉这个问题,所以我想知道它是否是另一个库导致它。将不得不逐段拆解我的代码,以找出这种行为是在哪里引入的。

    【讨论】:

    • 我发现问题与快递无关。诡异的。您是否能够隔离案例中的故障代码?
    【解决方案3】:

    试着把你的

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

    【讨论】:

      【解决方案4】:

      bodyParser 必须在 app.use(app.router) 之上,与 Perki 错误处理程序的相对位置无关

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 2023-03-08
        • 2016-02-13
        • 2020-01-22
        相关资源
        最近更新 更多