【问题标题】:How to make Express.js log errors during asynchronous operations如何在异步操作期间使 Express.js 日志错误
【发布时间】:2016-06-09 23:42:05
【问题描述】:

我有这样的代码:

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 放入每个操作中,因为我主要需要错误输出来进行开发,所以我可以看到我的拼写错误和类似的东西。有没有办法输出所有操作的错误,甚至是异步的?

【问题讨论】:

  • 您正确使用了 try/catch。如果您的设计要求您一遍又一遍地编写相同的代码,您可能会考虑功能故障,或者如果您挖掘 OO,使用多态也可能会清理它。
  • @NathanielJohnson,将try/catch 放入我编写的每个异步函数中都会产生一些开销,如果我只需要错误日志记录。浏览器在 Promise 中打印错误就好了,为什么 Node 不能呢?我想,我的配置可能有问题,但我不知道去哪里找。

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


【解决方案1】:

通常在不使用 Promises 进行异步调用时,使用error-first callbacks 来确保正确传达和处理错误是常见/最佳实践。这是最常见的方法,在 async 等库中大量使用。

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

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

MDN Promise .catch() Docs

Bluebird.js - Why Promises? 提供了一些使用 Promises 时错误处理的好处的示例。

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

【讨论】:

  • 感谢您的回复,但是,正如我所说,我只需要开发,这样可以节省查找拼写错误或明显逻辑错误的时间。将.catch() 添加到我在我的应用程序中所做的每一个承诺中,在节省时间方面对我没有多大帮助。我想,我可以为此使用类似 eslint 的东西,但 Node.js 无法打印默认情况下发生在 Promise 中的错误似乎很奇怪。浏览器可以做到这一点。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2017-01-11
相关资源
最近更新 更多