Javascript 如何在异步操作期间生成Express.js日志错误
我有这样的代码:Javascript 如何在异步操作期间生成Express.js日志错误,javascript,node.js,express,asynchronous,error-handling,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是未定义的变量,因此上面的代码不起作用,并且从未调用res.render(),但是控制台没有打印任何内容,它会无声地失败,浏览器陷入无休止的
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]
显然,我不能把
try/catch
放在每一个操作中,因为我在开发中主要需要错误输出,所以我可以看到我的打字错误之类的东西。是否有一种方法可以输出所有操作的错误,即使是异步操作?通常在执行不使用承诺的异步调用时,通常/最佳做法是确保正确地传达和处理错误。这是最常见的方法,在像这样的库中大量使用
因为您在代码片段中使用了承诺,所以我将提供一种使用承诺的错误处理方法。使用承诺的最好理由之一是,它们提供了非常好的开箱即用的异常处理
在承诺链中添加一个.catch()
调用。在承诺范围内发生的任何错误都将传播到最近的.catch()
处理程序.catch()
是在.then()
中提供onRejected
回调函数的替代方法
有一些例子说明了使用承诺时错误处理的好处
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
}
});
};
您正在正确使用try/catch。如果你的设计要求你一遍又一遍的写同样的代码,你可能会考虑功能崩溃或者如果你挖OO,使用多态性也会清理它。@ NasyielJordon,在我写的每一个异步函数中放<代码>尝试/catch < /代码>是一个开销,如果我需要的只是错误日志。浏览器可以打印承诺中的错误,那么为什么不能打印节点呢?我想,我的配置可能有问题,但我不确定该去哪里查找。谢谢你的回复,但是,正如我所说,我只需要进行开发,这样我就可以节省时间查找拼写错误或明显的逻辑错误。将
.catch()
添加到我在应用程序中做出的每一个承诺中,在节省时间方面对我没有多大帮助。我想,我可以使用类似eslint的东西来实现这一点,但Node.js无法打印默认情况下承诺中出现的错误,这似乎很奇怪。浏览器可以做得很好。