我使用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
帮助解决我的问题。
答案 0 :(得分:1)
呼叫顺序混乱了,这里有两件事是错误的:
upload
是异步的,尝试catch不会起作用。
upload
将像中间件一样使用,并且您不能像预期的multer这样通过validatorSignup
。这就是为什么为onFinished引发错误的原因,因为multer期望第三个参数为(next)=>{}
,而不是数组。
因此,您的标记应更像这样:
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()
});
}
...
});
注意1:我没有从文档中看到validationResult(req.body);
,只有validationResult(req);
。
注2:默认情况下,upload
和validatorSignup
之类的中间件错误将自动产生500,如果您要自定义错误消息(例如带有err的JSON),请检查{{3} }(编写错误处理程序)