如何在异步操作期间使Express.js记录错误

时间:2016-02-26 16:38:47

标签: javascript node.js express asynchronous error-handling

我有这样的代码:

exports.listSavedThreads = function (req, res) {
  SavedThread.find({}).exec().then(function (data) {
    wat.map();
    res.render('home/listSavedThreads');
  });
};

wat是未定义的变量,因此上面的代码不起作用,res.render()永远不会被调用,但是没有任何内容被打印到控制台,它无声地失败并且浏览器陷入无尽的加载

如果我在没有承诺的情况下这样做:

exports.listSavedThreads = function (req, res) {
  wat.map();
  res.render('home/listSavedThreads');
};

正常情况下,错误将被打印到控制台和浏览器。

我能够打印错误的唯一方法是使用try/catch

exports.listSavedThreads = function (req, res) {
  SavedThread.find({}).exec().then(function (data) {
    try {
      wat.map();
      res.render('home/listSavedThreads');
    } catch(e) {
      console.log('Error: ', e);
    }
  });
};

然后在控制台中我看到:

Error: [ReferenceError: wat is not defined]

显然,我不能把try/catch放到每个操作中,因为我主要需要错误输出进行开发,所以我可以看到我的错别字和类似的东西。有没有办法为所有操作输出错误,甚至是异步操作?

1 个答案:

答案 0 :(得分:1)

通常,在执行不使用Promise的异步调用时,通常/最佳做法是使用error-first callbacks来确保传达错误&妥善处理。这是最常用的方法,在async等库中大量使用。

由于您在代码段中使用了Promise,因此我将提供一种使用Promise进行错误处理的方法。使用Promises的最佳理由之一是因为它们提供了开箱即用的异常处理。

在您的Promise链中添加.catch()电话。您的承诺中发生的任何错误都会传播到最近的.catch()处理程序。 .catch()是在onRejected中提供.then()回调功能的替代方法。

MDN Promise .catch() Docs

Bluebird.js - Why Promises?有一些使用Promise时错误处理的好处的例子。

exports.listSavedThreads = function (req, res) {
  SavedThread.find({})
    .exec()
    .then(function (data) {
      wat.map();
      res.render('home/listSavedThreads');
    })
    .catch(function(err) {
      //handle errors
    });
};

或者,您可以在继续并相应地处理该方案之前检查是否已定义wat

exports.listSavedThreads = function (req, res) {
  SavedThread.find({})
    .exec()
    .then(function (data) {
      if(wat) {
        wat.map();
        return res.render('home/listSavedThreads');
      }
      else {
        // Handle wat undefined
      }
    });
};