为什么我的(try-catch)代码在NodeJS中执行得太早了?

时间:2018-12-20 23:10:40

标签: javascript node.js asynchronous console.log winston

根据HTTP GET调用的响应(使用本地http模块),在发出JSON.parse()事件后,我尝试end响应。我肯定知道我获取的数据是有效的JSON,但JSON.parse仍然会引发错误。而且我的日志表明JSON.parse应该先被调用。

res.on("end", () => {
  console.log('Req ended message is', body);

  try {
    var passport = JSON.parse(body);
  } catch (e) {
    w.info(
     "Cannot parse the response from : " +
     process.env.mongo_api_host +
     " | error  : " +
     e
   );
  }
  callback(passport);
 return;
});

我的日志显示:

info: Getting MongoDB passport for model : CESI
info: Cannot parse the response from : mongo_api | error  : SyntaxError: Unexpected end of JSON input
info: Req ended message is *long valid JSON data*

我们可以在日志中清楚地看到在"Req ended message is : ... stuff"之前捕获并记录了解析错误。

我想念什么?

编辑1:

即使按照注释中的建议将callback(passport)放在try块中,它仍然可以做到:

      res.on("end", () => {
        try {
          console.log("Req ended message is", body);
          var passport = JSON.parse(body);
          //TODO What if you get an array ?
          if (passport._id) delete passport._id;
          callback(passport);
        } catch (e) {
          w.info(
            "Cannot parse the response from : " +
              process.env.mongo_api_host +
              " | error  : " +
              e
          );
        }
        return;
      });

0 个答案:

没有答案