Node.js 使用Pressave中间件将Mongoose推送到阵列

Node.js 使用Pressave中间件将Mongoose推送到阵列,node.js,mongodb,mongoose,mongoose-middleware,Node.js,Mongodb,Mongoose,Mongoose Middleware,我正在尝试使用mongoose中可用的presave钩子更新数组。我使用这个数组进行审计,因此我想使用这些中间件强制执行正确的值 这是我的模式 const taskSchema = new mongoose.Schema({ id: { type: String, required: true }, status: { type: String, required: true }, code: { type: String, required: true }, // ENQUIRY events

我正在尝试使用mongoose中可用的presave钩子更新数组。我使用这个数组进行审计,因此我想使用这些中间件强制执行正确的值

这是我的模式

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});
这个逻辑在save中间件钩子中非常有效

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 
我发现这个.events是未定义的

如何访问该阵列以进行更新?我还应该忽略request.body.events中发送的任何内容

提前谢谢

请参阅,
save
is文档中间件
findOneAndUpdate
is查询中间件。此外,它还说:

查询中间件与文档中间件在一个微妙但重要的方面有所不同:在文档中间件中,
这是指正在更新的文档。在查询中间件中,mongoose不一定有对正在更新的文档的引用,因此
this
引用的是查询对象,而不是正在更新的文档

因此,在您的
findOneAndUpdate
pre中,
this.events
undefined

在您的情况下,使用以下代码可以解决问题:

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);
  }
});

谢谢你的回答。我确实理解文档和查询中间件之间的区别。这里的困难在于事件数组不是查询对象的一部分。事件数组需要从数据库中的文档中提取。因此,这里的解决方法是在调用findOneAndUpdate函数之前获取并更新事件数组。