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