节点快速验证可选选项不起作用

时间:2016-12-23 09:02:25

标签: node.js validation express

我正在尝试运行此验证,但由于某种原因,即使我将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)

3 个答案:

答案 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""falsenull 作为值,这意味着该属性是可选的。我试图让它与 checkNull 一起工作(所以只有 null 将用于表示该属性是可选的),但它没有用。

在此处使用 express-validator 6.10.1。