gpt4 book ai didi

node.js - 当我使用 Model.findOneAndUpdate 时,用于保存和更新的 Mongoose 预 Hook 不会被调用

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:26 25 4
gpt4 key购买 nike

我用 Mongoose 创建了一个快速应用程序。我还创建了一个保存和更新 Hook ,如下所示:

userSchema.pre("update", async function save(next) {
console.log("inside update")
});

userSchema.pre("update", async function save(next) {
console.log("inside save")
});

但是每当我调用 Model.findOneAndUpdate() 时,预 Hook 都不会被调用,saveupdate 预 Hook 是否不起作用findOneAndUpdate

最佳答案

如 Mongoose docs 中所述pre 和 post save() Hook 不会在 update() 和 findOneAndUpdate() 上执行。

您需要为此使用 findOneAndUpdate Hook 。但您无法访问将使用此关键字更新的文档。如果您需要访问将要更新的文档,则需要对该文档执行显式查询。

userSchema.pre("findOneAndUpdate", async function() {
console.log("I am working");
const docToUpdate = await this.model.findOne(this.getQuery());
console.log(docToUpdate); // The document that `findOneAndUpdate()` will modify
});

或者,如果您可以使用 this.set() 设置字段值,如下所示:

userSchema.pre("findOneAndUpdate", async function() {
console.log("I am working");
this.set({ updatedAt: new Date() });
});

假设我们有这个用户架构:

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
name: String,
updatedAt: {
type: Date,
default: Date.now
}
});

userSchema.pre("findOneAndUpdate", async function() {
console.log("I am working");
this.set({ updatedAt: new Date() });
});

module.exports = mongoose.model("User", userSchema);

这个用户文档:

{
"updatedAt": "2020-01-30T19:48:46.207Z",
"_id": "5e33332ba7c5ee3b98ec6efb",
"name": "User 1",
"__v": 0
}

当我们像这样更新该用户的名称时:

router.put("/users/:id", async (req, res) => {
let result = await User.findOneAndUpdate(
{ _id: req.params.id },
{ name: req.body.name },
{ new: true }
);

res.send(result);
});

updatedAt 字段值将设置为用户,并且它将被更新。

关于node.js - 当我使用 Model.findOneAndUpdate 时,用于保存和更新的 Mongoose 预 Hook 不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59992758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com