最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Mongoose 预保存挂钩 Model.updateOne 不是函数

网站源码admin38浏览0评论

Mongoose 预保存挂钩 Model.updateOne 不是函数

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}`
});
  1. 我收到传递给错误处理程序的预保存挂钩错误,该错误处理程序发送带有错误消息的响应,提示“User.updateOne 不是函数”
  2. 我的应用程序也会因 ERR_HTTP_HEADERS_SENT 错误而崩溃,因为上面的函数在
    await project.save().catch((err) => next(err));
    行之后不会停止执行,并尝试发送另一个响应。

有什么问题吗?为什么在钩子内部不能调用updateOne?如果钩子失败,我如何正确捕获错误?

回答如下:
  1. 这样做我可以达到预期的结果:
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;
  });
});
  1. 如果不是这样,错误处理效果很好:
await project.save().catch((err) => next(err));

我这样做:

try {
  await project.save();
} catch (err) {
  return next(err);
}

但这并不能真正回答我的问题。我仍然很困惑为什么上面的代码可以工作,而我原来的帖子中的等效代码却不能。

发布评论

评论列表(0)

  1. 暂无评论