【问题标题】:Why is Express Validator not allowing null values in optional fields?为什么 Express Validator 不允许在可选字段中使用空值?
【发布时间】:2020-09-07 00:08:03
【问题描述】:

我正在使用express-validator 验证表单,但许多字段是可选的。我已经在我的路线上配置了验证器,如下所示:

const ExpValidate = require('express-validator');
router.post('/api/posthandler', 
[ ExpValidate.body("TopicID").optional({nullable: true, checkFalsy: true}).trim().isInt(), ]
async function(req, res) {
    const errors = ExpValidate.validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.array() });
    }
    else {
    // Handle form here

}

当使用TopicID: null 提交表单时,我收到一条错误消息:

{
    "errors": [
        {
            "value": "null",
            "msg": "Invalid value",
            "param": "TopicID",
            "location": "body"
        }
    ]
}

即使我从optional() 方法中删除选项{nullable: true, checkFalsy: true},我也会遇到同样的错误。

如果我只做ExpValidate.body("TopicID").optional(),我不会收到任何错误,但这违背了验证器的目的,即检查isInt()是否提供了值。

如果我根本不提交TopicID,那么我也不会收到任何错误。

我的配置有问题吗?

更新:虽然这个问题是不久前提出的,但实际情况是表单数据将 EVERYTHING 作为字符串发送。所以null不能作为typeof null传递,它将作为字符串"null"传递。因此,可为空的检查不适用于表单数据(但它适用于 JSON 数据)。

【问题讨论】:

  • 文档或 github repo 可以更有效地了解 isInt 和 trim 的工作原理,
  • 在 isInt 之前尝试清理值然后进行其他检查github.com/validatorjs/validator.js#validators
  • @KunalAwasthi 如果我只执行ExpValidate.body("TopicID").optional(),我不会收到任何错误,但这违背了验证器的目的,即检查isInt() 是否提供了值。如果提供了值,我需要检查它是否为整数。我以为这就是 optional 的作用?

标签: javascript node.js express express-validator


【解决方案1】:

凭直觉,我尝试反转方法调用。这个验证器对我有用:

body("date_field").isDate().optional({ nullable: true }),

使用此输入:

{
  "date_field": null
}

看起来optional() 呼叫需要在最后!

【讨论】:

  • 很好,会试一试!
【解决方案2】:

经过大量测试,与docs相反,事实证明你不能通过TopicID: null但你可以通过TopicID: "",它将被视为可选。

可能是一个错误,不知道。

【讨论】:

    【解决方案3】:

    我已经试过了,验证器对我有用

    check
        .body('DCFMethodWeight')
        .isInt()
        .optional({ nullable: true, checkFalsy: true })
    

    我认为问题已在最新更新中解决,使用 6.3.1 版本。

    【讨论】:

    • 虽然这个问题是不久前的问题,但发生的事情是表单数据将所有内容都作为字符串发送。所以null不能作为null类型传递,它将作为字符串'null'传递。因此可空检查不适用于表单数据。
    【解决方案4】:

    我尝试研究,但找不到一个好的、简单的解决方案,因此我尝试了以下方法以在可选验证的情况下允许空值:

     body('date_field')
    .optional()
    .if(value=>value!==null)
    .isInt().withMessage('Please enter a valid number!')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2019-06-05
      • 2019-01-21
      • 1970-01-01
      相关资源
      最近更新 更多