【问题标题】:Data validation stopped working multipart/form-data数据验证停止工作 multipart/form-data
【发布时间】:2019-02-17 23:48:49
【问题描述】:

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

帮助解决我的问题。

【问题讨论】:

  • 你能在函数'onFinished'的地方加上代码吗?
  • 我的代码中没有这样的功能

标签: node.js multer express-validator


【解决方案1】:

调用顺序搞砸了,这里有两点不对:

  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,如果您想自定义错误消息(如带有err 的JSON),请查看Express error handling(编写错误处理程序)

【讨论】:

  • 谢谢,我发现了我的错误。但是我有一个新问题,当用户上传多张照片时,会发生错误。怎么处理才能给用户?
  • 错误是什么?你打算让用户上传多张照片吗?
  • 不,我想处理用户尝试上传多张照片时的错误。现在,当他从我这里上传照片时,我收到一个错误MulterError: Unexpected field at wrappedFileFilter How to bang her and give to the user in json?
  • "check out Express error handling", 之后基本上添加另一个中间件签名(err, req, res, next) => {}
  • 我试过这个,但是错误没有被处理。我声明了errorHandler 函数并添加了router.use(errorHandler)。但结果并没有奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2012-10-01
相关资源
最近更新 更多