我有一个server.js
,具有典型的快速配置,另外还有一个routes.js
,用于处理路由。
server.js
...
app.use('/', router);
app.use((err, req, res, next) => {
console.error(err);
res.status(500).render('error-server', {
layout: 'main',
title: 'Server Error'
});
});
...
routes.js
const fetch = require('node-fetch');
router.get('/what', function (req, res) {
throw new Error('BROKEN'); // works, throws the error that is handled in server.js
});
router.get('/test', (req, res) => {
fetch('wrong_url_to_test_error_handling')
.then(checkStatus)
.then(res => res.json())
.then(json => console.log(json));
res.send('Ok');
});
function checkStatus(res) {
if (res.ok) {
return res;
} else {
throw new Error('BROKEN'); // this does not work
}
}
/what
路由可以正确处理错误,但是/test
路由则不能。获取失败使checkStatus
函数失败,并触发了else语句,但是错误抛出的处理方式与/what
路由的错误处理方式不同。有这个原因吗?
谢谢:)
答案 0 :(得分:4)
您正陷入承诺链中,并且由于您没有.catch
,因此错误被吞没了。
这就是为什么它没有到达Express错误处理程序的原因。
在这种情况下,您需要通过链接next
将错误转发到.catch
函数:
router.get('/test', (req, res, next) => {
fetch('wrong_url_to_test_error_handling')
.then(checkStatus)
.then(res => res.json())
.then(json => {
console.log(json)
res.send('Ok')
})
.catch(next)
})