我遇到了一个与我正在构建的api的express-validator处理错误的问题。我得到了它的工作,但我不明白为什么最初的代码不工作,想知道是否有人可以为我解释它?
我在路由上使用express-validator检查中间件,如下所示:
router.put(
"/sign-up",
[
check("name", "Invalid Name").trim().isLength({ min: 1 }),
check("email", "Invalid Email")
.isEmail()
.isLength({ min: 1 })
.normalizeEmail(),
],
userController.putUser
);
然后在控制器中,我有下面的代码来处理,以防出现错误:
exports.putUser = async (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
// const err = new Error("Validation Failed!");
// err.data = errors.array();
// err.statusCode = 422;
// throw err;
return res
.status(422)
.json({ message: "Validation Failed!", data: errors.array() });
}
// .... do more stuff here
所以被注释掉的部分是我最初的尝试,它不起作用,而只处理if语句中的响应根据我的情况工作。我想把新的错误漏斗到我的错误处理中间件在我的app.js文件中,看起来像这样:
app.use((err, req, res, next) => {
return res.status(err.statusCode).json({ errorMessage: err.message, data: err.data });
});
我得到的错误是"未处理的承诺错误"。在我的控制器函数中使用注释掉的代码时。谁能帮助我理解为什么返回响应立即工作,但抛出错误没有?
谢谢你的帮助!
在这行你定义了exports.putUser = async (req, res, next)
所以putUser
必须返回promise
因为类型是async
但是你返回别的东西
return res.status(422).json(
{ message: "Validation Failed!", data: errors.array() });
在你的情况下,你必须删除return
,这样做
res.status(422).json(
{ message: "Validation Failed!", data: errors.array() });