数据验证停止了多部分/表单数据的工作

时间:2019-02-16 16:27:15

标签: node.js multer express-validator

我使用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

帮助解决我的问题。

1 个答案:

答案 0 :(得分:1)

呼叫顺序混乱了,这里有两件事是错误的:

  1. upload是异步的,尝试catch不会起作用。

  2. 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:默认情况下,uploadvalidatorSignup之类的中间件错误将自动产生500,如果您要自定义错误消息(例如带有err的JSON),请检查{{3} }(编写错误处理程序)