我试图通过插入未包含在某些必填字段中的对象来测试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
数组-需要哪个。
猫鼬没有收到错误,而是应用了该操作并将permissions
的空白数组插入MongoDB中的集合。
这不是我在这里需要的行为。 我不会在集合中查看丢失细节的文档。
如果用户没有为其值提供permissions
数组,那么我根本不接受查询。
为什么猫鼬会忽略模式中的必填字段?
答案 0 :(得分:1)
Arrays具有一项特殊功能:
数组是特殊的,因为它们隐式具有默认值[](空数组)。
要覆盖此默认值,您需要将默认值设置为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验证失败:Permissions:路径
permissions
是必需的。