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

      在此处使用 express-validator 6.10.1。

      【讨论】:

        猜你喜欢
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2016-11-16
        • 1970-01-01
        相关资源
        最近更新 更多