数据验证停止工作 multipart/form-data

Data validation stopped working multipart/form-data

我使用 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. upload 是异步的,try catch 将无法正常工作。

  2. upload 将像中间件一样使用,您不能像这样通过 validatorSignup 期望 multer 进行验证。这就是为 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,如果你想自定义错误消息(如你的 JSON with err),查看 Express error handling(编写错误处理程序)