错误处理程序与Express中的未知端点



我目前有下面的后端服务器与express构建的代码。看看这段代码,我本来希望第11行对next(error)的调用首先击中app.use(unknownEndpoint)中间件,从而向客户端发送{ error: "unknown endpoint" }消息。

但是,它实际上执行错误处理程序中的代码。我想我对快递的理解有些地方不对,但我不确定是什么。

据我所知,所有中间件都是按顺序执行的。那么,这是否意味着unknownEndpoint将在每次出现错误时执行,甚至在我们到达错误处理程序之前?

app.get("/api/notes/:id", (request, response) => {
Note.findById(request.params.id)
.then((note) => {
if (note) {
response.json(note);
} else {
response.status(404).end();
}
})
.catch((error) => {
next(error);
});
});

const unknownEndpoint = (request, response) => {
response.status(404).send({ error: "unknown endpoint" });
};
app.use(unknownEndpoint);
const errorHandler = (error, request, response, next) => {
console.error(error.message);
if (error.name === "CastError") {
return response.status(400).send({ error: "malformated id" });
}
next(error);
};
app.use(errorHandler);

Express能够通过检查它们的arity(即参数的数量)来区分正常中间件和错误中间件。

在文档中作为这一段的细节出现:https://expressjs.com/en/guide/error-handling.html writing-error-handlers

以与其他中间件函数相同的方式定义错误处理中间件函数,除了错误处理函数有四个参数而不是三个: (err, req, res, next).

所以,如果你调用next(err), Express在它的内部中间件列表中寻找一个有4个参数的中间件来执行。

最新更新