我正在猫鼬(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 请求提交数据,数据在请求正文中。我正在使用邮递员提交请求,并检查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
更新:
我想道歉,因为这是我的错误。我根据请求动态创建配置,并且复制的服务一度被设为空,doh!
但是,在通过required: true
验证后,自定义验证程序仍未执行。我也找不到任何关于验证器和执行顺序的文档,这将非常有用。以下是验证器代码段供参考:
function isValidServices(services) {
for (const service of services) {
if (typeof service.name !== 'string') return false;
}
return true;
}
在尝试了各种方法并更详细地查看了猫鼬 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"]
}
});
在此之后,我的验证器函数被执行了,没有任何问题。希望这对某人有所帮助。