为什么 Express Validator 不允许可选字段中存在空值?

vol*_*one 6 javascript node.js express express-validator

我正在使用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

}
Run Code Online (Sandbox Code Playgroud)

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

{
    "errors": [
        {
            "value": "null",
            "msg": "Invalid value",
            "param": "TopicID",
            "location": "body"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我的配置有问题吗?

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

phu*_*que 12

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

body("date_field").isDate().optional({ nullable: true }),
Run Code Online (Sandbox Code Playgroud)

使用此输入:

{
  "date_field": null
}
Run Code Online (Sandbox Code Playgroud)

看来optional()需要最后打电话!


vol*_*one 1

经过大量测试并与文档相反,事实证明您无法通过TopicID: null,但您可以通过TopicID: "",并且它将被视为可选。

可能是bug,不知道。