首页 > 解决方案 > 将虚拟属性值传递给 Mongoose `pre-save` 钩子

问题描述

在我的 MongoDB/Node 后端中,我使用 Mongoose 中间件(前/后挂钩)以便在文档的某些方面发生更改时生成注释。一切都按预期工作——除了一件。我需要知道对记录进行更改的最后一个人的 _id - 以便可以将其包含在生成的注释中。

现在,如果可以将此值保存到文档上的属性中,那就相当简单了。我只会将该值分配给“lastModifiedBy”之类的属性。但是,该项目的方向不允许这样做。

所以,我想知道我是否可以用虚拟财产做到这一点?我很清楚如何从文档中存在的数据生成虚拟属性,如下所示:

personSchema.virtual('name.full').get(function () {
  return this.name.first + ' ' + this.name.last;
});

但是当值不是从文档模型上已有的数据中解析出来时,这将如何工作?

而且,为了澄清,在我更新记录的函数中,我确实可以访问这个值。但是如何通过pre-save钩子将该值传递给我的触发器文件?这就是我正在努力解决的问题。如果可能,对它如何工作的基本演示会有所帮助。或者,如果有不同的方法来实现这一点,我也会对此持开放态度。

标签: mongoose

解决方案


这是将值传递给预保存挂钩的方法:使用 ES6 符号,如下所示:

const lastModifiedBy = Symbol.for('lastModifiedBy');

// later
app.getAsync(async (req, res) => {
  const doc = await MyModel.findOne({ _id: req.params.id });
  doc[lastModifiedBy] = req.params.staffId;
  // Can now access `this[lastModifiedBy]` in save middleware: https://mongoosejs.com/docs/middleware.html
  await doc.save();
});

推荐阅读