数据验证停止了多部分/表单数据的工作
我使用express-validator
检查文本字段和multer
来检查头像。但我有一个问题,express-validator
停止检查文本字段,如果您将该字段留空,快速验证器将不会给出该字段为空的错误消息。
我在单独的变量中显示了文本字段:
import { check, validationResult } from 'express-validator/check';
const validatorSignup = [
check('user_name').exists().isLength({ min: 4, max: 20 }),
....
];
接下来,我想在注册时检查用户是否填写了所有字段以及是否加载了头像:
router.post('/signup', (req, res) => {
try {
upload(req, res, validatorSignup, (err) => {
console.log(req.body)
const errors = validationResult(req.body);
if (!errors.isEmpty()) {
return res.status(422).json({
err: errors.array()
});
}
....
} catch (err) {
return res.status(500).json({
err: err
});
}
});
但是我收到一个错误:
onFinished(req, function () { next(err) })
^
TypeError: next is not a function
帮助解决我的问题。
回答如下:调用序列搞砸了,这里有两件事是错的:
upload
是异步的,尝试捕获将无法正常工作。upload
将像中间件一样被使用,你不能像这样期望mazxswpoi进行验证。这就是onFinished抛出错误的原因,因为multer期望第三个参数是validatorSignup
,而不是数组。
因此,您的标记应该更像这样:
(next)=>{}
注1:我没有从文档中看到router.post('/signup', upload, validatorSignup, (req, res) => {
console.log(req.body)
const errors = validationResult(req.body);
if (!errors.isEmpty()) {
return res.status(422).json({
err: errors.array()
});
}
...
});
,只有validationResult(req.body);
。
注意2:默认情况下,像validationResult(req);
和upload
这样的中间件中的错误会自动产生500,如果你想自定义错误信息(比如你的错误的JSON),请查看validatorSignup
(编写错误处理程序)