Errorhandling in middleware does not pass error
基本上,我得到了这样的异步函数:
1 2 3 4 5 6 7 8 9 10 | 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函数时,该错误会丢失在某处...:
1 2 3 4 5 6 7 | .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"); }) |
有人知道我在做什么错吗?我想利用上面函数中的错误。
我不是控制器内
来自https://expressjs.com/en/advanced/best-practice-performance.html#handle-exceptions-properly
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 }) |
我在这篇文章中找到了解决方案,您可以尝试使用此代码吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 } }) |