使用链验证通过 Express Validator 检查可选字段的存在

Using chain validation to check existence of optional fields with Express Validator

我正在尝试检查 API 请求中是否存在可选字段,如果该字段存在,则执行嵌套验证以检查其他两个字段(一个或另一个,或隐式两者)都存在于其中。我正在使用 Express Validator 来尝试完成此任务。

// Sample request body
{
  <...>
  thresholds: {
    min: 3,
    max: 5
  }
}

// (Attempted) validation chain
check('thresholds').optional()
      .custom( innerBody => {
          console.log('THRESHOLDS', innerBody);
          oneOf([
              check('innerBody.min').optional(),
              check('innerBody.max').optional()
          ]);
      })

上面的代码片段是我正在验证完整请求正文的更大验证链的一部分。我也尝试从内部 checks 中删除 innerBody. 字符串,但仍然没有成功。我正在 console.loging 阈值主体,它打印正确,但是当我试图让我的集成测试通过时,我仍然收到验证错误:

{"name":"ValidationError","message":"ValidationError: Validation failed","errors":[{"location":"body","param":"thresholds","value":{"min":3,"max":5},"msg":"Invalid value"}]}

我对 Express Validator 比较陌生,所以如果我正确地使用 oneOf 链接验证 wrong/not 或某些东西会喜欢一些指针!

谢谢

看起来 .custom 函数需要 return 一个 Promise。答案如下:

.custom(innerBody => {
            if (!(innerBody.min) || !(innerBody.max)) return Promise.reject('Missing min or max');
            return Promise.resolve();
        })

Remember: Always return a boolean value from the callback of .custom() function. Otherwise your validation might not work as desired.

来源:Custom validation guide

一般来说,如果你处理异步.custom()函数,你可能会有使用Promises的需求。然后你将有义务 return Promise.resolve() / Promise.reject() 正确的验证器行为。

来源:SO answer