express-validator验证作为数组的参数

时间:2016-05-20 06:31:42

标签: node.js express

我正在使用express-validator来验证我的快速应用程序中的POST数据。我有一个表单,其中有一个选项,用户可以在其中选择多个选项:

<select name="category" multiple id="category">
    <option value="1">category 1 </option>
    .......
</select>

如果我选择多个值,则提交表单后的有效负载会显示此信息:

...&category=1&category=2&....

现在,在我的Express应用程序中,我尝试像这样验证它:

req.checkBody('category', 'category cannot be empty').notEmpty();

但是,即使在我发送多个值后,我总是会收到错误 - category cannot be empty。如果我将变量打印为req.body.category[0] - 我会得到数据。但是,不知何故无法理解我需要将其传递给验证器的方式。

4 个答案:

答案 0 :(得分:8)

您可能需要创建自己的自定义验证程序;

expressValidator = require('express-validator');
validator = require('validator');

app.use(expressValidator({
  customValidators: {
     isArray: function(value) {
        return Array.isArray(value);
     },
     notEmpty: function(array) {
        return array.length > 0;
     }
     gte: function(param, num) {
        return param >= num;
     }
  }
}));

req.checkBody('category', 'category cannot be empty').isArray().notEmpty();

答案 1 :(得分:1)

这可能有点晚了,但对于那些不使用customValidator而想要一个干净的解决方案的人来说,我创建了一个可以挖掘到最深的数组并验证其内容的验证器。

https://github.com/edgracilla/wallter

在您的情况下,验证将是:

const halter = require('wallter').halter
const Builder = require('wallter').builder // validation schema builder

const builder = new Builder()

server.use(halter())

server.post('/test', function (req, res, next) {
    let validationSchema = builder.fresh()
      .addRule('category.*', 'required')
      .build()

    // validationSchema output:
    // { 'category.*': { required: { msg: 'Value for field \'category.*\' is required' } } }

    req.halt(validationSchema).then(result => {
        if (result.length) {
            res.send(400, result)
        } else {
            res.send(200)
        }

        return next()
    })
})

可以在构建器初始化中覆盖错误消息。检查回购README.md是否有深度用法。

答案 2 :(得分:0)

尝试一下:

router.post('/your-url', 
      [
        check('category').custom((options, { req, location, path }) => {
            if (typeof category === 'object' && category && Array.isArray(category) && category.length) {
              return true;
            } else {
              return false;
            }
          })
    ],
    controller.fn);

答案 3 :(得分:0)

回答得有点晚,但希望这对某人有帮助。

如果您使用的是enter image description here,则可以通过“最小/最大长度”选项来检查数组是否为空或超过特定限制

req.checkBody('category', 'category cannot be empty').isArray({ min: 1, max: 10 });