node js 和 mongo , pre, post hook 中间件没有在 findByIdAndUpdate 上执行
Node js and mongo , pre, post hook middleware are not executed on 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) {
}
管理员UI
当我从这里添加数据时,钩子被击中并被触发
挂钩
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()
}
})
来自官方documentation:
This function triggers the following middleware. findOneAndUpdate()
因此,它不会触发 pre('save')
中间件。相反,您应该使用 pre('findOneAndUpdate')
中间件。相关官方文档here.
我有一个名为 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) {
}
管理员UI
当我从这里添加数据时,钩子被击中并被触发
挂钩
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()
}
})
来自官方documentation:
This function triggers the following middleware.
findOneAndUpdate()
因此,它不会触发 pre('save')
中间件。相反,您应该使用 pre('findOneAndUpdate')
中间件。相关官方文档here.