我正在 mongoose (v4.13.8) 中使用混合值数组构建架构。我提出了以下架构:
var deviceConfigSchema = new mongoose.Schema({
capabilities: {
type: [capabilitySchema],
required: true,
validator: [isValidCapabilities, "Not a valid capability array"]
},
services: {
type: [{}],
required: true,
validator: [isValidServices, "Not a valid service array"]
}
});
问题是,当我尝试提交数据时,我收到一条验证错误,提示 services: Path 'services' is required.
。奇怪的是,我为“功能”发送的数据工作正常,唯一的区别是我明确指定了一个架构。
从 services
中删除 required: true
会导致返回值中出现空数组对象。
我正在使用 API POST 请求提交数据,数据位于请求正文中。我正在使用 Postman 提交请求,并选中 x-www-form-urlencoded
。这是从正文键值输入复制的
capabilities[0][field_map][field]:pressure
capabilities[0][field_map][type]:float
capabilities[0][field_map][format]:hPa
services[0][name]:rest
services[0][receive][0][capability_id]:0
services[0][receive][0][path]:/api/relay/0
更新:
我想道歉,因为这是我的错误。我根据请求动态创建一个配置,并且在某一时刻复制的服务被设为空,哦!
但是,在通过 required: true
验证后,自定义验证器仍然没有被执行。我也找不到任何有关验证器 和 执行顺序的文档,这将非常有用。以下是供引用的验证器片段:
function isValidServices(services) {
for (const service of services) {
if (typeof service.name !== 'string') return false;
}
return true;
}
最佳答案
在尝试了各种方法并更详细地查看 mongoose API 文档后,我发现模式也有一个 validate
选项。 http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate
我从此更改了我的架构:
var deviceConfigSchema = new mongoose.Schema({
capabilities: {
type: [capabilitySchema],
required: true,
validator: [isValidCapabilities, "Not a valid capability array"]
},
services: {
type: [{}],
required: true,
validator: [isValidServices, "Not a valid service array"]
}
});
为此 [注意 validate
而不是 validator
]...
var deviceConfigSchema = new mongoose.Schema({
capabilities: {
type: [capabilitySchema],
required: true,
validate: [isValidCapabilities, "Not a valid capability array"]
},
services: {
type: [{}],
required: true,
validate: [isValidServices, "Not a valid service array"]
}
});
此后,我的验证器函数就可以正常执行了。希望这对某人有帮助。
关于node.js - 使用混合数组 [{ }] 时的 Mongoose 架构验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48482435/