如何在asynchronous操作期间使Express.jslogging错误
我有这样的代码:
exports.listSavedThreads = function (req, res) { SavedThread.find({}).exec().then(function (data) { wat.map(); res.render('home/listSavedThreads'); }); };
wat
是未定义的variables,所以上面的代码不起作用,并且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
放到每一个操作中,因为我大多需要为了开发而输出错误,所以我可以看到我的错别字和类似的东西。 有没有办法输出所有操作的错误,甚至是asynchronous的?
通常,在执行不使用Promise的asynchronous调用时,通常/最佳做法是使用错误优先callback来确保错误得到适当的沟通和处理。 这是最常见的方法,并在像async
这样的库中被大量使用。
既然你在你的代码片段中使用Promise,我会提供一个使用Promises进行error handling的方法。 使用Promise的最好的理由之一是因为它们提供了很好的例外处理。
将.catch()
调用添加到您的Promise链中。 您的承诺中发生的任何错误都会传播到最近的.catch()
处理程序。 .catch()
是在.catch()
中提供onRejected
callback函数的替代方法。
MDN Promise .catch()
文档
Bluebird.js – 为什么承诺? 有一些使用Promise时error handling好处的例子。
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 } }); };