Express中的404后退路线

时间:2016-06-23 09:50:38

标签: node.js express error-handling routing

我对Express看似糟糕的文档感到困惑。我想归档一个非常简单的事情:为express中的每个不匹配的路由返回自定义404。起初,这似乎很直接:

app.get('/oembed', oembed()); // a valid route
app.get('/health', health()); // another one
app.get('*', notFound()); // catch everything else and return a 404

但是,当有效网址被打开时(例如/oembed),express会继续处理这些路线并最终调用notFound() 以及。我仍然看到我的/oembed响应,但我在控制台中收到一条错误消息,说明notFound()正在尝试设置标题(404),并且已经发送了正文。

我尝试像这样实现middleware that catches errors

function notFound() {
  return (err, req, res, next) => {
    console.log(err);
    res.sendStatus(404);
    next(err);
  };
}

并将其添加到app.use(notFound());,但这甚至不会被调用。我发现在互联网上很难找到任何东西(例如,这不是过时或错误的),官方文档似乎没有任何特定的这个非常标准的用例。我有点卡在这里,我不知道为什么。

2 个答案:

答案 0 :(得分:1)

实施oembed

export default () => function oembed(req, res, next) {
  const response = loadResponseByQuery(req.query);

  response.onLoad()
    .then(() => response.syncWithS3())
    .then(() => response.setHeaders(res)) // sets headers
    .then(() => response.sendBody(res))   // sends body
    .then(() => next())                   // next()

    .catch(() => response.sendError(res))
    .catch(() => next());
};

在发送响应主体后调用next,这意味着它会将请求传播到任何后续(匹配)路由处理程序,包括notFound()处理程序。

使用Express,next通常仅用于传递请求,如果当前处理程序没有响应它,或者如果不知道如何处理或想要处理它

答案 1 :(得分:0)

根据routes docs,我们可以使用正则表达式作为路径匹配器

app.get(/.*/, (req, res) => {
  res.status(404).send();
  //res.json({ status: ":(" });
});