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

标签 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 是 undefined variable ,所以上面的代码不起作用并且 res.render() 永远不会被调用,但是没有任何内容被打印到控制台,它静静地失败,浏览器陷入无限加载。

如果我在没有 promise 的情况下做同样的事情:

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

然后在控制台中我看到:

错误:[ReferenceError: wat is not defined]

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

最佳答案

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

由于您在代码片段中使用了 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
      }
    });
};

关于javascript - 如何在异步操作期间使 Express.js 记录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35657121/

相关文章:

node.js - 哪个最有效 : serving static files directly by nginx or by node via nginx reverse proxy?

javascript - TypeError : $(. ..).typeahead 不是函数

javascript - d3.js 代码从 javascript 控制台到 html 页面

node.js - 如何在nodejs中屈服于按键检测?

MySQL 从一个表中 SELECT 并在另一个表中 INSERT - 性能

node.js - db.createCollection 不是函数

javascript - HTML 到 PDF(通过 javascript)如何添加 css 或表格?

javascript - 正则表达式 javascript 搜索前两位数字并确保所有字符之后都是字母

javascript - 表达 CORS 子域

Javascript 这些调用在 Node.js 中是否相同?