findByIdAndUpdate запускает промежуточное ПО findOneAndUpdate () . Хуки до и после сохранения () не выполняются в findOneAndUpdate ().
Вы не можете получить доступ к обновляемому документу в промежуточном программном обеспечении pre('findOneAndUpdate')
. Если вам нужен доступ к документу, который будет обновлен, вам нужно выполнить явный запрос для документа.
Пример схемы с промежуточным программным обеспечением findOneAndUpdate:
const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const schema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true
},
email: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
});
schema.pre("save", async function(next) {
if (!this.isModified("password")) return next();
this.password = await bcrypt.hash(this.password, 12);
next();
});
schema.pre("findOneAndUpdate", async function() {
const docToUpdate = await this.model.findOne(this.getQuery());
// add your hashing logic to here
let newPassword = await bcrypt.hash(docToUpdate.password, 12);
this.set({ password: newPassword });
});
module.exports = mongoose.model("User", schema);
Пример маршрута для тестирования:
router.put("/users/:id", async (req, res) => {
let result = await User.findByIdAndUpdate(req.params.id, {}, { new: true });
res.send(result);
});
Обратите внимание, что я использовал {} внутри findByIdAndUpdate, потому что наш пароль будет хешироваться в промежуточном программном обеспечении findOneAndUpdate
.