我正在尝试使用猫鼬中可用的预保存钩子更新数组。我将这个数组用于审计目的,因此我想使用这些中间件强制执行正确的值
这是我的架构
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
中发送的任何内容先谢谢了。
答案 0 :(得分:1)
请参阅Types of Middleware,save
是文档中间件,而findOneAndUpdate
是查询中间件。在notes中,它表示:
查询中间件在一个微妙但重要的方面与文档中间件不同:在文档中间件中,
this
表示要更新的文档。在查询中间件中,猫鼬不一定引用要更新的文档,因此this
引用查询对象而不是要更新的文档。
因此,在您的findOneAndUpdate
前,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);
}
});