{ const findP-6ren">
gpt4 book ai didi

javascript - 在 Express 中使用自定义错误中间件时未定义 next

转载 作者:行者123 更新时间:2023-12-04 07:51:33 24 4
gpt4 key购买 nike

我正在尝试在 express 中使用 next() 将错误传递给以下路由中的自定义中间件:

app.post("/api/persons", (req, res) => {
const findPerson = Person.findOne({ name: req.body.name });
if (findPerson.length) {
res.status(404).json({ error: "Name already exists" });
} else if (req.body && req.body.name && req.body.number) {
const person = new Person({
name: req.body.name,
number: req.body.number,
});
person
.save()
.then((savedPerson) => {
console.log("saved successfully.");
res.json(savedPerson).end();
})
.catch((err) => next(err));
app.use(morgan("tiny"));
} else {
res.status(404).json({ error: "Name or number missing" });
}
});
我已经定义了中间件功能如下:
const errorHandler = (error, request, response, next) => {
console.error(error.message);

if (error.name === "CastError") {
return response.status(400).send({ error: "malformatted id" });
}

next(error);
};
app.use(errorHandler);
在所有其他 app.use() 之后,我将此中间件添加到文件的最后一个。
但我不断收到引用错误如下:
UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
尽管我显然在使用 catch 块,但它似乎会抛出错误。
我尝试将错误处理程序的定义添加到顶部,但它仍然显示相同的错误。

最佳答案

改变

app.post("/api/persons", (req, res) => { // next is missing here
// ..///
});
app.post("/api/persons", (req, res, next) => { // add next  here
// ../// next(err); // call next with error now
});

Since promises automatically catch both synchronous errors and rejected promises, you can simply provide next as the final catch handler and Express will catch errors, because the catch handler is given the error as the first argument.


阅读 - https://expressjs.com/en/guide/error-handling.html

For errors returned from asynchronous functions invoked by route handlers and middleware, you must pass them to the next() function, where Express will catch and process them.

function errorHandler (err, req, res, next) {
if (res.headersSent) {
return next(err)
}
res.status(500)
res.render('error', { error: err })
}

关于javascript - 在 Express 中使用自定义错误中间件时未定义 next,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66947464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com