我正在使用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]
- 我会得到数据。但是,不知何故无法理解我需要将其传递给验证器的方式。
答案 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)