为什么快速验证程序不允许在可选字段中使用空值?



我正在使用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,那么我也不会收到任何错误。

我的配置有问题吗?

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

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

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

使用此输入:

{
"date_field": null
}

看起来optional()电话需要是最后一个!

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

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

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

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

可能是错误,不知道。

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

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

最新更新