28

我正在使用快速验证器来验证我的字段。但现在我有 2 或 3 个对象的数组,其中包含如下所示的“userId”和“Hours”字段。

[
  {
    user_id:1,
    hours:8
  },
  {
    user_id:2,
    hours:7
  }
]

现在我需要验证是否有任何对象属性(如hours 或 user_id)为空。如果为空则抛出错误。

4

5 回答 5

46
let arr = [
  {
    user_id:1,
    hours:8
  },
  {
    user_id:2,
    hours:7
  }
]

您可以像这样进行检查,请注意 arr 将是请求正文中的键。邮递员的截图

check("arr.*.user_id")  
  .not()  
  .isEmpty()

check("arr.*.hours")  
  .not()  
  .isEmpty()
于 2018-12-11T17:17:27.500 回答
6

我可以使用这样的通配符来做到这一点:

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)
于 2020-06-15T05:22:07.197 回答
4

您可以通过访问请求正文来实现此目的:

const { body } = require('express-validator')

body('*.*')
  .notEmpty()
于 2020-03-04T12:31:04.200 回答
3

对于想要使用 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
    }
})
于 2021-05-18T18:28:36.470 回答
0

如果您要验证整个主体并且主体是一个对象数组,您可以通过使用验证器(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 文档。

于 2021-10-20T13:03:23.387 回答