【问题标题】:Node express-validation optional option not working节点快速验证可选选项不起作用
【发布时间】:2021-07-02 06:56:27
【问题描述】:
我正在尝试运行此验证,但由于某种原因,即使我将 optional 设置为 true,它也会验证参数。有没有人知道我做错了什么?
var schema = {
"title": {
in: "body",
optional: true,
isLength: {
options: [{ min: 1, max: 128 }],
errorMessage: 'Title must be between 1 and 128 characters'
}
}
}
req.check(schema)
【问题讨论】:
标签:
node.js
validation
express
【解决方案1】:
直接来自docs 它说:
您可以使用 optional() 方法跳过验证。默认情况下,如果请求对象上不存在密钥,它只会跳过验证。如果您想跳过基于虚假属性(null、未定义等)的验证,您可以传入 { checkFalsy: true }。
我假设在您的情况下,请求正文中存在标题键,但值是空白字符串。所以 checkFalsy 值不起作用。至少它从来没有对我有用。要使验证成为可选,您可以创建一个自定义验证器并在您的架构中使用它:
this.app = express();
this.app.use(expressValidator({
customValidators: {
isLengthOptional: (str, options) => {
// make it optional
if (str === undefined || str === '') {
return true;
}
const min = options.min || 0;
const max = options.max;
const surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
const len = str.length - surrogatePairs.length;
return len >= min && (typeof max === 'undefined' || len <= max);
}
}
});
var schema = {
"title": {
in: "body",
optional: true,
isLengthOptional: {
options: [{ min: 1, max: 128 }],
errorMessage: 'Title must be between 1 and 128 characters'
}
}
}
req.check(schema)
【解决方案2】:
schema 中的可选标志表示该字段可以省略,以防出现它必须遵循提供的规则。
在您的示例中,这将被视为有效,因为省略了“标题”。
{
"body": {}
}
同时,这将是无效的,因为“标题”存在但不遵守规则
{
"body": {
"title": null
}
}
这只是我根据您发布的内容的假设,如果您提供更多信息,调试会容易得多。类似的东西:
您向您的应用发送了哪个请求?
您从该请求中得到什么响应?
【解决方案3】:
在我的例子中,我需要一个参数是可选的,并且在发送时接受整数值。
使用checkSchema,以下工作正常:
checkSchema({
boxId: {
optional: {
options: {
checkFalsy: true,
},
},
in: ['body'],
errorMessage: 'invalid boxId',
isInt: true
},
// ...
})
请记住,checkFalsy 接受 0、""、false 和 null 作为值,这意味着该属性是可选的。我试图让它与checkNull 一起工作(所以只有null 将用于表示该属性是可选的),但它不起作用。
在此处使用 express-validator 6.10.1。