首页 > 解决方案 > Node js 和 mongo , pre, post hook 中间件不在 findByIdAndUpdate 上执行

问题描述

我有一个名为 vehicle 的模式,我可以在其中添加来自管理员的数据,也可以添加导入 csv 文件的数据。顺便说一句,我正在使用 keystone js。

现在,当我从管理员添加数据时,钩子被触发并命中,但是当我从导入 csv 文件代码中添加数据时,尽管数据被添加到数据库,但钩子没有被命中和触发

我们可以使用 Vehicle.model.findOneAndUpdat 触发预保存挂钩吗?

我的导入 csv 代码片段

exports.import = function (req, res) {

    let file = fs.createReadStream(req.files.file.path)


    Papa.parse(file, {
        header: true,
        worker: true,
        preview: prev_val,

        complete: function (results) {

            let vehicles = _.each(results.data, function (value, key) {


                let condition = { VIN: value.VIN }

                Vehicle.model.findOneAndUpdate(condition, value, { upsert: true, new: true }, function (err, doc) {



                    }

管理界面

当我从这里添加数据时,钩子被触发 我的管理员 -

  schema.pre('save', function (next) {
    console.log("HIT" , hit)
    if (this.isNew) {
      next()
    } else {
      console.log("this._original" , this._original)
      console.log("this._original1" , this)
      this._diff = getDiff(this, this._original)
      next()
    }
  })

标签: javascriptnode.jsmongodbmongoosekeystonejs

解决方案


来自官方文档

此函数触发以下中间件。findOneAndUpdate()

所以,它不会触发pre('save')中间件。相反,您应该使用pre('findOneAndUpdate')中间件。相关官方文档在这里


推荐阅读