基本上我得到了一个异步函数,像这样:
export default (htmlFilePath, observer, redisClient) => async (req, res, next) => {
try {
...bunch of logic...
} catch (error) {
// if i log error here it displays correctly
next(error)
}
}
因此,如果上面提到了代码,我可以正确地使用stackTrace等错误,但是当将next()传递给该Express函数时,该错误在某处丢失了...:
.get('/*', loader(filePath, observer, redisClient))
.use(function (err, req, res, next) {
res.statusCode = 500;
// Logger only logs: TEST
logger.error('TEST', err, err.stack);
res.send("Internal Server Error");
})
有人知道我在做什么错吗?我想利用上面函数中的错误。
答案 0 :(得分:1)
我在此post找到了解决方案,您可以尝试这段代码吗?
function loader(req, filePath, observer, redisClient, next) {
try {
...bunch of logic...
} catch (error) {
// if i log error here it displays correctly
req.error = error;
}
next();
}
api.get('/*', loader(req, filePath, observer, redisClient))
.use(function (req, res, next) {
// Logger only logs: TEST
var err = req.error;
if(err){
logger.error('TEST', err, err.stack);
res.send("Internal Server Error");
}else{
//Do something here
}
})
答案 1 :(得分:1)
我不是控制器内的try/catch
的忠实拥护者,错误处理程序中间件应该处理它们。
来自https://expressjs.com/en/advanced/best-practice-performance.html#handle-exceptions-properly
app.get('/', function (req, res, next) {
// do some sync stuff
queryDb()
.then(function (data) {
// handle data
return makeCsv(data)
})
.then(function (csv) {
// handle csv
})
.catch(next)
})
app.use(function (err, req, res, next) {
// handle error
})