如何在异步操作
我有这样的代码使Express.js日志错误:如何在异步操作
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
放到每个操作中,因为我大多需要用于开发的错误输出,所以我可以看到我的拼写错误和类似的东西。有没有办法输出所有操作的错误,甚至是异步的?
通常,在执行不使用Promise的异步调用时,通常/最佳做法是使用error-first callbacks来确保正确处理错误时传递&。这是最常用的方法,并在像async
这样的图书馆中大量使用。
由于您在代码片段中使用Promise,我将提供一种使用Promises进行错误处理的方法。使用Promise的最好理由之一是因为它们提供了很好的异常处理功能。
添加一个.catch()
呼叫到您的承诺链。您的承诺中发生的任何错误将传播到最近的.catch()
处理程序。 .catch()
是在.then()
中提供onRejected
回拨函数的替代方法。
Bluebird.js - Why 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默认情况下不能打印承诺中出现的错误,这似乎很奇怪。浏览器可以做到这一点。 –
您正在正确使用try/catch。如果你的设计需要你一遍又一遍地写相同的代码,你可能会考虑一个功能分解或者如果你挖掘OO,使用多态可能也会清理它。 –
@NathanielJohnson,在我写的每一个异步函数中放入'try/catch'都会带来一点负担,如果我需要的只是错误日志。浏览器在承诺内打印错误就好,为什么Node不能?我认为,我的配置可能有问题,但我不确定在哪里寻找。 –