为什么不表达句柄抛出新错误?

时间:2019-09-10 14:05:30

标签: javascript node.js express

我有一个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路由的错误处理方式不同。有这个原因吗?

谢谢:)

1 个答案:

答案 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)
})