基本上我有一个像这样的异步函数:
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)
}
}
因此,如果代码来到上面的catch我可以正确使用stackTrace等错误,但是当使用next()传递它时,表达函数错误在某处丢失...:
.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");
})
谁知道我做错了什么?我想利用上面函数中的错误。
我在这个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
}
})
我不是控制器内的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
})