将猫鼬模式字段设为只读

时间:2018-10-05 16:16:39

标签: node.js mongodb mongoose

我有一个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模式中的特定字段变为只读状态?

2 个答案:

答案 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

缺点是您的用户不会收到一条错误消息,使他们知道他们尝试更新或已更新的字段是只读的