猫鼬使用预保存中间件推送到阵列

时间:2019-08-04 19:42:38

标签: node.js mongodb mongoose mongoose-middleware

我正在尝试使用猫鼬中可用的预保存钩子更新数组。我将这个数组用于审计目的,因此我想使用这些中间件强制执行正确的值

这是我的架构

const taskSchema = new mongoose.Schema({
id: { type: String, required: true },
status: { type: String, required: true },
code: { type: String, required: true }, // ENQUIRY
events:{
    type:[{
            status: {type: String, required: true},
            date:{ type: Date, required: true}

    }], required: false
},
assignedTo: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: false },
}, {timestamps:true});

该逻辑在保存中间件挂钩中非常有用。

taskSchema.pre('save', async function(next) {
    try {
        let event = {}
        let now = Date.now();
        event.status = this.status;
        event.date = now;
        this.events.push(event);
        next();
    } catch (error) {
        console.log(error);
        next(error);
    }
});

在findOneAndUpdate挂钩中使用时出错

taskSchema.pre('findOneAndUpdate', async function(next) {
    try {

        let event={}
        let now = Date.now();
        event.status = this._update.status;
        event.date = now;
        this.events.push(event);
        next();
    } catch (error) {
        console.log(error);
        next(error);
    }
});

我不确定我在这里缺少什么。这是错误

TypeError: Cannot read property 'push' of undefined 

我看到this.events是未定义的。

如何访问该阵列以进行更新?我也应该忽略request.body.events

中发送的任何内容

先谢谢了。

1 个答案:

答案 0 :(得分:1)

请参阅Types of Middlewaresave文档中间件,而findOneAndUpdate查询中间件。在notes中,它表示:

  

查询中间件在一个微妙但重要的方面与文档中间件不同:在文档中间件中,this表示要更新的文档。在查询中间件中,猫鼬不一定引用要更新的文档,因此this引用查询对象而不是要更新的文档。

因此,在您的findOneAndUpdate前,this.eventsundefined

对于您而言,使用以下代码可以解决问题:

taskSchema.pre('findOneAndUpdate', async function(next) {
  try {

    let event={}
    let now = Date.now();
    event.status = this._update.status;
    event.date = now;
    this._update['$push'] = {events: event};
    next();
  } catch (error) {
    console.log(error);
    next(error);
  }
});