MongoDB触发器文件中的代码正在生成Customer.findOne()不是函数错误

时间:2019-02-21 18:25:16

标签: javascript mongodb

为了能够比较文档的保存前和保存后版本,我试图在pre钩子中查找文档,然后使用它来查看文档中文档的更改。 post保存钩子。

但是由于某种原因,我收到“ Customer.findOne()不是函数”错误。这对我来说没有任何意义,因为我已将模型导入此触发器文件,然后在我的函数中执行以下操作:

const Customer = require("../customer");

// Get a version of the document prior to changes
exports.preSave = async function(doc) {
  console.log("preSave firing with doc._id", doc._id); // this ObjectId logs correctly
  if (!doc) return;

  this.preSaveDoc = await Customer.findOne({ _id: doc._id }).exec();
  console.log("this.preSaveDoc: ", this.preSaveDoc);
};

同样,此代码会产生错误:

  

“ Customer.findOne()不是函数”

仅供参考,我的Customer模型中的相关代码如下:

let Schema = mongoose
  .Schema(CustomerSchema, {
    timestamps: true
  })
  .pre("count", function(next) {
    next();
  })
  .pre("save", function(next) {
    const doc = this;
    trigger.preSave(doc);
    next();
  })
  .post("save", function(doc) {
    trigger.postSave(doc);
  })
  .post("update", function(doc) {
    trigger.postSave(doc);
  })
  .post("findOneAndUpdate", function(doc) {
    trigger.postSave(doc);
  });

module.exports = mongoose.model("Customer", Schema);

我在这里想念什么?为什么这段代码会在非常标准的MongoDB操作上产生此错误?

2 个答案:

答案 0 :(得分:1)

此问题已解决。

如果mongoDb版本为3.6或更高,则可以使用change streams

更改流可让您知道文档中发生了什么更改。在mongoDb中运行一个后台进程,该进程会通知您的代码一个事件(创建,更新,删除)发生并向您传递文档。您可以过滤字段以了解确切的值。

您可以参考此blog

这是一个经典的用例,可以应用更改流。比重新发明轮子更好:)

答案 1 :(得分:0)

这是使它起作用的方法。而不是像这样通过Mongoose查找文档的预先保存/预先转换的版本:

// Get a version of the document prior to changes
exports.preSave = async function(doc) {
  console.log("preSave firing with doc._id", doc._id); // this ObjectId logs correctly
  if (!doc) return;

  this.preSaveDoc = await Customer.findOne({ _id: doc._id }).exec();
  console.log("this.preSaveDoc: ", this.preSaveDoc);
};

...以这种方式查找文档:

// Get a version of the document prior to changes
exports.preSave = async function(doc) {
  let MongoClient = await require("../../config/database")();
  let db = MongoClient.connection.db;

  db.collection("customers")
    .findOne({ _id: doc._id })
    .then(doc => {
      this.preSaveDoc = doc;
    });
};