我有一个Mongoose“用户”架构,并且其中一个字段需要为只读。 (“帐户”字段可以在外部进行更新,所以我不希望对用户的更新会覆盖所做的更改。)
var UserSchema = new Schema({
firstName: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your first name']
},
lastName: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your last name']
},
displayName: {
type: String,
trim: true
},
email: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your email'],
match: [/.+\@.+\..+/, 'Please fill a valid email address']
},
username: {
type: String,
unique: 'Username already exists',
required: 'Please fill in a username',
trim: true
},
password: {
type: String,
},
accounts: [{
account_hash: {type: String},
account_name: {type: String}
}],
updated: {
type: Date
},
created: {
type: Date,
default: Date.now
}
}
我已经看到建议将字段虚拟化的答案,但是保存后,该字段将从Mongo中删除。有没有一种简单的方法可以使Mongoose模式中的特定字段变为只读状态?
答案 0 :(得分:2)
在我看来,最好的选择是pre
的{{1}} middleware。
您可以检查是否用save/update
更改了不想要的字段,并简单地抛出错误,提示您只能从此处读取字段:
isModified
要进行更新,您应该通过someSchema.pre('save', function(next) {
if(this.isModified('someField')) {
throw 'someField is read only!'
}
else {
next();
}
});
获取更新,并在那里查找您的字段。
答案 1 :(得分:1)
在最新版本的Mongoose上,您可以将“ immutable”设置为要保持不变的字段上的属性。 您可以在Mongoose immutable处阅读更多内容。
所以您可以做类似的事情
const schema = new Schema({
name: { type: String, immutable: true },
age: Number
});
const Model = mongoose.model('Test', schema);
await Model.create({ name: 'test' });
const doc = await Model.findOne();
doc.isNew; // false
doc.name = 'new name';
doc.name; // 'test', because `name` is immutable
缺点是您的用户不会收到一条错误消息,使他们知道他们尝试更新或已更新的字段是只读的