使用链验证通过 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()
]);
})
上面的代码片段是我正在验证完整请求正文的更大验证链的一部分。我也尝试从内部 check
s 中删除 innerBody.
字符串,但仍然没有成功。我正在 console.log
ing 阈值主体,它打印正确,但是当我试图让我的集成测试通过时,我仍然收到验证错误:
{"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()
函数,你可能会有使用Promises的需求。然后你将有义务 return Promise.resolve()
/ Promise.reject()
正确的验证器行为。
来源:SO answer
我正在尝试检查 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()
]);
})
上面的代码片段是我正在验证完整请求正文的更大验证链的一部分。我也尝试从内部 check
s 中删除 innerBody.
字符串,但仍然没有成功。我正在 console.log
ing 阈值主体,它打印正确,但是当我试图让我的集成测试通过时,我仍然收到验证错误:
{"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()
函数,你可能会有使用Promises的需求。然后你将有义务 return Promise.resolve()
/ Promise.reject()
正确的验证器行为。
来源:SO answer