node.js - 使用混合数组 [{ }] 时的 Mongoose 架构验证问题

标签 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.。奇怪的是,我为“功能”发送的数据工作正常,唯一的区别是我明确指定了一个架构。

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/

相关文章:

javascript - 下划线和 Mongoose : Use document as outer function's return value

javascript - 使用深层嵌套的异步函数进行错误处理

javascript - V8 会自动缓存编译的正则表达式吗?

javascript - 有什么方法可以识别 mongoose/mongoDB 中的更新/更新?

javascript - 如何在 mongodb 中将 $push 、 $set 和 $inc 放在一起?

mongoose - 保存后自动填充子文档

node.js - Mongoose findByIdAndUpdate upsert 在初始插入时返回空文档

node.js - 如何修复此错误 : error TS2456: Type alias 'Geometry' circularly references itself?

Mongodb:将数字字符串转换为数字

r - 如何使用 r 在列表中插入列表