node.js - 使用 express-validator 验证对象数组
问题描述
我express-validator
用来在 API 中验证我的请求正文。我想验证一个请求字段——dataPoints
它应该是一个对象数组。我想检查每个对象中是否有一个键 -dataType
并且它的值是数组的一部分 - ["selection", "number", "text", "date"]
。这是我的代码
validateParameters: () => {
return [
body("name").exists().withMessage("The name is required!"),
body("description").exists().withMessage("The description is required"),
body("dataPoints").isArray().withMessage("Datapoints can not be empty and must be an array!"),
body("dataPoints").custom(async (value) => {
if (value !== undefined & value.length > 0) {
value.forEach(function (dataPoint) {
var options = ["selection", "number", "text", "date"];
let dataValue = dataPoint.dataType ? dataPoint.dataType : "";
console.log(dataValue)
if (options.indexOf(dataValue.toLowerCase()) !== -1) {
return Promise.reject();
}
})
.withMessage("Invalid data point");
}
}),
]
},
我目前在运行而不是Invalid data point
传递错误时收到此错误dataType
{
"status": "error",
"errors": [
{
"message": "Cannot read property 'withMessage' of undefined"
}
]
}
我该如何解决?
另外,在提交之前如何确保dataPoints
数组至少包含一个对象,因为目前可以提交一个空的对象,这是错误的!
解决方案
您应该在自定义验证器中使用 throw new Error而不是 .withMessage 方法,这是一个示例:
body("properties")
.custom((value) => {
if (_.isArray(value)) {
if (value.length !== 0) {
for (var i = 0; i < value.length; i++) {
if (
/^[ \u0600-\u06FF A-Za-z ][ \u0600-\u06FF A-Za-z ]+$/.test(
value[i]
)
) {
if (i === value.length - 1) {
return true;
} else {
continue;
}
} else {
throw new Error("Invalid data point");
}
}
} else {
return true;
}
} else {
throw new Error("Invalid data point");
}
})
.optional(),
如果你想通过你的验证器,你应该返回 true
推荐阅读
- linux - 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?
- macos - 在 Mac 上安装 ffmpeg 失败
- c++ - 我们如何在 C++ 中的无序映射中分配变量并更新它们?
- javascript - 为什么 JavaScript 没有检测到所有 cookie?
- java - 如何使用 Apache Tomcat 服务器在 VScode IDE 中设置 servlet 和 jsp 项目?
- javascript - 如何在方法单击时更新 sessionStorage 中的值?
- javascript - 如何在 String 对象的原型上实现这个测试?
- bash - bash脚本中的列表积累
- python - 代码仅在 Jupyter 中有效,但当我直接从桌面运行时脚本不断崩溃
- c# - C# - Microsoft Graph API - 从自定义列表中获取图片