在保存或更新时自动设置猫鼬架构属性

时间:2019-07-26 21:00:46

标签: node.js mongodb mongoose mongoose-schema restify

我有一个问题。如何配置猫鼬模式,使其在保存和/或更新时设置某些字段?

这就是我想要做的。 我有一个用户架构,并且在创建新文档时,我希望将createdOn字段设置为当前日期。 并且当现有文档更新时,我希望将updatedOn字段设置为当前日期

// user.model.ts
import { Document, Model, model, Schema } from 'mongoose';
import PasswordUtil from '../../../util/PasswordUtil';

export interface IUser extends Document {
    username: string;
    createdOn: Date;
    updatedOn: Date;
    firstName: string;
    lastName: string;
    email: string;
    password: string;
}

const encryptPassword = (password: string) => PasswordUtil.encrypt(password);

export const UserSchema = new Schema<IUser>({
    username: {
        required: true,
        type: String,
        unique: true
    },
    createdOn: {
        required: true,
        type: Date,
        set: Date.now
    },
    updatedOn: {
        required: true,
        type: Date
    },
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true,
        set: encryptPassword
    }
});

export const UserModel: Model<IUser> = model('User', UserSchema);

我有set: Date.nowcreatedOn属性。我不希望客户端发送此值。但是由于模型中没有createdOn,所以验证失败,因为我还用createdOn配置了required: trueupdatedOn也是如此。 这就是我现在正在做的事情

// user.controller.ts
public createUser(request: Request, response: Response) {
    const user: IUser = request.body as IUser;

    const userSchema = new UserModel(user);
    userSchema.set('updatedOn', Date.now());
    userSchema.set('createdOn', Date.now());
    userSchema.save()
        .then((model: IUser) => ResponseHelper.responseOK(response, model))
        .catch((err: MongoError) => ResponseHelper.responseInternalServerError(response, { message: err.message }));
}

我怎样才能使所有设置createdOnupdatedOn字段的逻辑都驻留在模型本身内? 另外,在创建新模型时应设置createdOn 在更新现有模型时,应设置updatedOn

2 个答案:

答案 0 :(得分:0)

在架构(https://mongoosejs.com/docs/defaults.html)中使用“默认”。这将设置当前的创建日期。

foo
bar
etc
---

关于更新.update上的时间戳-如果您运行的是Mongoose> 4.0,则可以使用时间戳

https://mongoosejs.com/docs/guide.html#timestamps

答案 1 :(得分:0)

您可以将timestamps添加到架构中,它将自动创建createdAtupdatedAt字段,updatedAt将在您每次更新文档时得到更新

export const UserSchema = new Schema<IUser>({/* schema */}, { timestamps: true })

您还可以像这样重命名字段

{ timestamps: { createdAt: 'createdOn', updatedAt: 'updatedOn' }}