gpt4 book ai didi

node.js - Mongoose 保存时没有必填字段

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:02 28 4
gpt4 key购买 nike

我试图通过插入一个未包含在某些必填字段中的对象来测试 Mongoose 架构。

情况是这样的:

let schema = {
_supplier: {
type: Schema.Types.ObjectId,
required: true
},
permissions: {
type: [
{
level: {
type: Number,
min: 1,
max: 9,
required: true
},
title: {
type: String,
minlength: 0,
maxlength: 16
},
modules: [String]
}
],
validate: [permissionsLimit, '${PATH} exceeds the limit of 9'],
required: true
}
};

function permissionsLimit(v) {
return v.length<=9;
}

let permissionsTestSchema = new Schema(schema);

let PermissionsTest = mongoose.model("permissionsTestSchema", permissionsTestSchema);

let permissionTest = new PermissionsTest({
_supplier: mongoose.Types.ObjectId()
});

permissionTest.save(err => {
if (err) return cast.error(err);
return cast.ok();
});

如您所见,我创建了一个仅包含 _supplier 键的实例 - 我没有添加 permissions 数组 - 这是必需的

Mongoose 不会收到错误,而是应用该操作并向 MongoDB 中的集合插入一个空白的权限数组。

这不是我在这里需要的行为。我不想要集合中缺少详细信息的文档。

如果用户没有为其值提供permissions数组,我根本不接受查询。

为什么 Mongoose 会忽略架构中的必填字段?

最佳答案

Arrays Mongoose 有一个特殊功能:

Arrays are special because they implicitly have a default value of [] (empty array).

To overwrite this default, you need to set the default value to undefined

因此您可以将架构更改为:

let schema = {
_supplier: {
type: mongoose.Schema.Types.ObjectId,
required: true
},
permissions: {
type: [
{
level: {
type: Number,
min: 1,
max: 9,
required: true
},
title: {
type: String,
minlength: 0,
maxlength: 16
},
modules: [String]
}
],
validate: [permissionsLimit, '${PATH} exceeds the limit of 9'],
required: true,
default: undefined
}
};

然后您的代码将抛出异常并显示以下消息:

UnhandledPromiseRejectionWarning: ValidationError: permissionsTestSchema validation failed: permissions: Path permissions is required.

关于node.js - Mongoose 保存时没有必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52728127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com