我正在使用快速验证器来验证我的字段。但现在我有 2 或 3 个对象的数组,其中包含如下所示的“userId”和“Hours”字段。
[
{
user_id:1,
hours:8
},
{
user_id:2,
hours:7
}
]
现在我需要验证是否有任何对象属性(如hours 或 user_id)为空。如果为空则抛出错误。
我正在使用快速验证器来验证我的字段。但现在我有 2 或 3 个对象的数组,其中包含如下所示的“userId”和“Hours”字段。
[
{
user_id:1,
hours:8
},
{
user_id:2,
hours:7
}
]
现在我需要验证是否有任何对象属性(如hours 或 user_id)为空。如果为空则抛出错误。
我可以使用这样的通配符来做到这一点:
app.post('/users', [
body().isArray(),
body('*.user_id', 'user_idfield must be a number').isNumeric(),
body('*.hours', 'annotations field must a number').exists().isNumeric(),
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({errors: errors.array()});
}
return res.status(200).json(req.body)
您可以通过访问请求正文来实现此目的:
const { body } = require('express-validator')
body('*.*')
.notEmpty()
对于想要使用 checkSchema 验证对象数组的任何人,这里有一个示例,我正在验证可以包含 0 个项目的对象数组。如果你抛出一个函数,你甚至可以进行自定义验证:
JSON:
{
"employees": [
{
"roleId": 3,
"employeeId": 2,
},
{
"roleId": 5,
"employeeId": 4,
},
]
}
检查架构:
const customValidator = (async (employees, { req }) => {
if (!Array.isArray(employees)) {
return true; // let the base isArray: true validation take over.
}
if(!something) {
throw Error('employee error');
}
// validate at your will here.
return true;
}
checkSchema({
employees: {
isArray: true,
min: 0,
custom: {
options: customValidator
},
},
"employees.*.roleId": {
isInt: true
},
"employees.*.employeeId": {
isInt: true
}
})
如果您要验证整个主体并且主体是一个对象数组,您可以通过使用验证器(1)、错误检查(2)和有用的中间件(2)创建中间件链来做到这一点。
import { body, validationResult } from "express-validator";
// we will use lodash method like an example
import { isArray } from "lodash";
app.post(
"/users",
// the second argument "meta" contains whole request and body
body().custom((_unused, meta) => myCustomValidator(meta.req.body)), // (1)
ensureNoErrors, // (2)
doUsefulStuff // (3)
);
实际上就是这样:您需要使用构造(1)来获得结果。
为了阐明方法的实现:
function myCustomValidator(body) {
if (isArray(body)) {
throw new Error("Body must be an array");
}
// do other checks with the whole body, throw error if something is wrong
return true;
}
function ensureNoErrors(req, res, next) {
// check if validation result contains errors and if so return 400
const errors = validationResult(req);
if (errors.isEmpty()) {
return next();
}
return res.status(400).json({
// return message of the first error like an example
error: errors.array()[0].msg,
});
}
function doUsefulStuff(req, res, next) {
// do some useful stuff with payload
const [user1, user2] = req.body;
}
链接到 express-validator 文档。