一旦保存在mongoose中,如何使一些字段不可更新?

时间:2017-04-19 06:53:13

标签: node.js mongodb mongoose

我已按如下方式构建架构:

const UserInfoSchema = new Schema({
    email: { type: String, required: true, unique: true },
    username: { type: String, required: true, unique: true },
    userId: { type: Schema.Types.ObjectId, ref: 'User'},
    displayName: { type: String, required: true },
    profilePic: {
        filename: {type: String},
        url: {type: String}
    },
    created_at: Date,
    updated_at: Date
})

我需要的是,一旦保存了电子邮件,用户名和userId等字段,就不应该修改。对于这种功能,有没有预先制作mongoose的东西?

我已经对schema.pre('update', (next) => {})做了一些研究,但没有真正有用/不知道是否可以使用上述功能。非常感谢任何有关此事的帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

有一种更简单的方法 保存架构时,您可以将字段设置为不可变,例如

const UserInfoSchema = new Schema({
    email: { type: String, required: true, unique: true, immutable:true },
    username: { type: String, required: true, unique: true, immutable:true },
    userId: { type: Schema.Types.ObjectId, ref: 'User', immutable:true},
    displayName: { type: String, required: true },
    profilePic: {
        filename: {type: String},
        url: {type: String}
    },
    created_at: Date,
    updated_at: Date
})

它不会引发任何错误,如果需要,您应该在其他地方进行检查,但是当您尝试修改不可变字段时,它根本不会被更改

答案 1 :(得分:0)

for(const key in userUpdates) {
    switch(key)  { 
        case 'username':
        case 'email':
            throw new Error('These field/s cannot be changed anymore');
    }
}
User.findByIdAndUpdate(id, userUpdates, { new: true, runValidators: true });