Node.js 使用Pressave中间件将Mongoose推送到阵列
我正在尝试使用mongoose中可用的presave钩子更新数组。我使用这个数组进行审计,因此我想使用这些中间件强制执行正确的值 这是我的模式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
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函数之前获取并更新事件数组。