我对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());
,但这甚至不会被调用。我发现在互联网上很难找到任何东西(例如,这不是过时或错误的),官方文档似乎没有任何特定的这个非常标准的用例。我有点卡在这里,我不知道为什么。
答案 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: ":(" });
});