使用混合[{}]数组时的Mongoose Schema验证问题

时间:2018-01-28 01:57:04

标签: node.js mongodb mongoose database-schema

我正在使用混合值数组在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.验证错误。奇怪的是,我为“功能”发送的数据运行良好,唯一的区别是我明确指定了一个模式。

required: true中删除services会导致返回值中出现空数组对象。

我使用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

更新

我想道歉,因为这是我的错误。我根据请求动态创建配置,并且一次将复制的服务设为null,doh!

但是,在通过required: true验证后,自定义验证程序仍未执行。我也找不到任何关于验证器和执行顺序的文档,这些文档非常有用。以下是验证器代码段供参考:

function isValidServices(services) {
    for (const service of services) {
        if (typeof service.name !== 'string') return false;
    }
    return true;
}

1 个答案:

答案 0 :(得分:0)

我已经尝试了各种方法并详细了解了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"]
    }
});

在此之后我的验证器功能正在执行而没有任何问题。希望这有助于某人。