没有必填字段的猫鼬保存
Mongoose saves without a required field
我正在尝试通过插入 object 来测试 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 没有接收到错误,而是应用操作并将 permissions
的空白数组插入到 MongoDB 中的 collection。
这不是我需要的行为。
我不想要 collection 中缺少详细信息的文档。
如果用户不提供 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.
我正在尝试通过插入 object 来测试 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 没有接收到错误,而是应用操作并将 permissions
的空白数组插入到 MongoDB 中的 collection。
这不是我需要的行为。 我不想要 collection 中缺少详细信息的文档。
如果用户不提供 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.