我正在尝试运行此验证,但由于某种原因,即使我将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)
答案 0 :(得分:2)
直接从docs说:
您可以使用optional()方法跳过验证。默认情况下,如果请求对象上不存在该键,则它仅跳过验证。如果你想根据属性为falsy(null,undefined等)跳过验证,你可以传入{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)
答案 1 :(得分:0)
架构中的可选标志表示该字段可以省略,如果它出现,必须遵循提供的规则。
在您的示例中,这将被视为有效,因为省略了“标题”。
{
"body": {}
}
同时,由于“标题”存在但不遵循规则
,这将无效{
"body": {
"title": null
}
}
这只是我根据您发布的内容做出的假设,如果您提供了更多信息,则调试起来会容易得多。类似的东西:
你发送给你的应用程序的请求是什么?
你从那个请求得到的回应是什么?
答案 2 :(得分:0)
就我而言,我需要一个可选的参数,并在发送时接受整数值。
使用 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。