如何在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()中提供onRejectedcallback函数的替代方法。

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