Mongoose 预保存挂钩 Model.updateOne 不是函数
Mongoose 预保存挂钩无法按预期工作。或者我不太明白如何正确使用它。
我有这个带有预保存挂钩的架构:
const mongoose = require('mongoose');
const User = require('./user');
const ProjectSchema = new mongoose.Schema({
title: { type: String, required: true },
description: { type: String },
created: { type: Date, required: true, default: Date.now },
manager: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
users: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
tickets: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Ticket' }]
});
ProjectSchema.pre('save', async function () {
await User.updateOne({ _id: this.manager }, { $push: { projects: this.id } })
.exec()
.catch((err) => {
throw err;
});
});
module.exports = mongoose.model('Project', ProjectSchema);
当我尝试在代码中的某处执行以下操作时:
const project = new Project({
title: req.body.title,
description: req.body.description,
manager: req.user.id
});
await project.save().catch((err) => next(err));
res.status(200).json({
status: 200,
message: 'Project created',
url: `/projects/${project.id}`
});
- 我收到传递给错误处理程序的预保存挂钩错误,该错误处理程序发送带有错误消息的响应,提示“User.updateOne 不是函数”
- 我的应用程序也会因 ERR_HTTP_HEADERS_SENT 错误而崩溃,因为上面的函数在
行之后不会停止执行,并尝试发送另一个响应。await project.save().catch((err) => next(err));
有什么问题吗?为什么在钩子内部不能调用updateOne?如果钩子失败,我如何正确捕获错误?
回答如下:- 这样做我可以达到预期的结果:
ProjectSchema.pre('save', function () {
const project = await this.populate('manager').catch((err) => {
throw err;
});
await project.manager.updateOne({ $push: { projects: project.id } }).catch((err) => {
throw err;
});
});
- 如果不是这样,错误处理效果很好:
await project.save().catch((err) => next(err));
我这样做:
try {
await project.save();
} catch (err) {
return next(err);
}
但这并不能真正回答我的问题。我仍然很困惑为什么上面的代码可以工作,而我原来的帖子中的等效代码却不能。