我正在尝试为我的POST请求正文编写一个验证器函数。由于验证过程在整个项目中重复多次,因此我为此编写了一个函数,validate.js
以便可以在其他地方重复使用它。
这是我在中的函数的代码validate.js
,它以函数验证器作为参数,因此可以应用于req.body
第3行:
module.exports = function (validator) {
return function (req, res, next) {
const { error } = validator(req.body);
if (error) return res.status(400).send(error.details[0].message);
next();
}
}
然后,我继续将此功能用作POST方法中的中间件,例如:
router.post('/', validate(validateUser), async (req, res) => {
...
});
其validateUser
功能如下所示:
function validateUser(user) {
const schema = {
name: Joi.string().min(5).max(50).required(),
email: Joi.string().min(5).max(255).required().email(),
password: Joi.string().min(5).max(255).required(),
class: Joi.number().min(1900).max(maxYear).required(),
major: Joi.string().min(5).max(255).required(),
};
return Joi.validate(user, schema);
}
但是,这给了我一个似乎无法修复的“不是错误”功能。我怀疑这与validator
返回函数范围之外的事实有关,因此validator
内部基本上是一个未声明的变量。我该如何解决?谢谢!
这是错误:
{"level":"error","message":"validator is not a function validator is not a function", "stack":"TypeError: validator is not a function
at D:\\projects\\vikingreviews\\backend\\middleware\\validate.js:3:21
at newFn (D:\\projects\\vikingreviews\\backend\\node_modules\\express-async-errors\\index.js:16:20)
at Layer.handle [as handle_request] (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\layer.js:95:5)
at next (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\route.js:137:13)
at Route.dispatch (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\route.js:112:3)
at newFn (D:\\projects\\vikingreviews\\backend\\node_modules\\express-async-errors\\index.js:16:20)
at Layer.handle [as handle_request] (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\layer.js:95:5)
at D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\index.js:281:22
at Function.process_params (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\index.js:335:12)
at next (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\index.js:275:10)
at Function.handle (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\index.js:174:3)
at router (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\index.js:47:12)
at newFn (D:\\projects\\vikingreviews\\backend\\node_modules\\express-async-errors\\index.js:16:20)
at Layer.handle [as handle_request] (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\layer.js:95:5)
at trim_prefix (D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\index.js:317:13)
at D:\\projects\\vikingreviews\\backend\\node_modules\\express\\lib\\router\\index.js:284:7"}
你可以试试这个吗?
router.post('/', validate((user) => {
const schema = {
name: Joi.string().min(5).max(50).required(),
email: Joi.string().min(5).max(255).required().email(),
password: Joi.string().min(5).max(255).required(),
class: Joi.number().min(1900).max(maxYear).required(),
major: Joi.string().min(5).max(255).required(),
};
return Joi.validate(user, schema);
}), async (req, res) => {
res.send('OK');
});
这是因为我怀疑看到错误消息,说明您未validateUser
正确传递方法。这样,我们直接传递函数并确认错误是否是因为您传递的验证函数可能是错误的方式
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句