问题描述
问题
自定义验证器未给出任何响应。我想在 express-validator 中验证以下对象。特权密钥必须有效并且存在于我的阵列中。如果特权对象不存在,则验证无效,因为它是可选的,但如果对象存在,则该值必须有效
def prime_max(x):
a = x
i = 2
while i in range(2,int(a+1)):
if a%i == 0:
a = a/i
if a == 1:
print(i)
i = i-1
i = i+1
user.js
{
"email" : "john@gmail.com","privileges" : {
"topic" : true
}
}
我是node-js的初学者,没有使用任何自定义验证器。
解决方法
好的,因此您的脚本几乎没有问题:
-
在自定义处理程序中,您正在使用
forEach
进行迭代:Object.keys(value).forEach(function(key){ if(!privilegesArray.includes(key)){ return false;
但是,问题是,您是从内部forEach处理程序中返回
false
,而不是从custom
处理程序本身中返回。 -
根据documentation,您不应顺便返回。您应该改为抛出错误。
-
如果一切顺利,则没有提供处理程序,例如。
return res.status(200).json({ errors: "[]" });
,以防路由处理程序一切正常。 -
最重要的我想,您没有注册任何
bodyParser
。我很确定express无法理解POST正文中的application / json:app.use(bodyParser.json());
-
在中间件解析输入的json之后,您不应该比较
value[key] === 'true'
,因为它将是布尔值true
。
下面是看似符合您要求的完整代码,已使用提琴手进行了测试:
const { check,validationResult } = require("express-validator");
const bodyParser = require("body-parser");
const express = require("express");
const app = express();
const port = 3000;
let privilegesArray = ["topic"];
app.use(bodyParser.json());
app.post(
"/",[
check("privileges")
.custom(async (value,{ req }) => {
var keys = Object.keys(value);
for (var k = 0; k < keys.length; k++) {
var key = keys[k];
if (!privilegesArray.includes(key)) continue;
if (
value[key] !== true &&
value[key] !== false &&
value[key] !== ""
) {
throw new Error("Topic is invalid.");
}
}
return true;
})
.withMessage("Invalid privileges")
.optional({ checkFalsy: true }),],async (req,res) => {
const errors = await validationResult(req);
console.log(errors);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
return res.status(200).json({ errors: "[]" });
}
);
app.listen(port,() => {
console.log(`Example app listening at http://localhost:${port}`);
});