node.js - Mongoose findByIdAndUpdate 似乎绕过了我的预“保存”钩子并返回过时的数据
问题描述
我的用户模型上有一个预“保存”钩子,用于使用 bcrypt 进行密码加密,在创建新用户记录时效果很好。但是,在编辑用户(为了简洁起见,我使用 findByIdAndUpdate)并更改密码时,它似乎绕过了该挂钩并保存为纯文本。从 Mongoose 文档中,我被引导相信任何更新事件都会调用“保存”中间件,那么为什么会发生这种情况以及如何修复它?
此外,尽管使用了 async/await,但响应仍返回 n-1 个数据。
exports.editUser = async function(req, res, next) {
try {
const user = await db.User.findByIdAndUpdate(req.params.id, req.body, {useFindAndModify: false});
return res.status('200').json(user);
}
catch(err) {
console.log(err);
return next({
status: 400,
message: 'User could not be updated or does not exist.'
});
}
};
假设我们的电子邮件以“email@email.com”开头,并且我使用 req.body.email =“newemail@email.com”向我的编辑路由发送了一个 PUT 请求。返回的 JSON 仍然显示“电子邮件:email@email.com”。现在假设我使用 req.body.email = "thirdemail@email.com" 发送另一个 PUT 请求。返回的 JSON 现在显示“电子邮件:newemail@email.com”。
所以更新似乎正确发生,但返回的用户对象没有反映更新。鉴于使用“等待”,我的“用户”变量所代表的用户对象不应该是更新的用户记录吗?
解决方案
好的,看起来它绕过验证器的原因已经在这里详述了:为什么 Mongoose 在更新时不验证?
我仍然不完全清楚为什么 runValidators=true 没有激活我的中间件,或者为什么返回的 User 对象不是更新版本,但无论如何我都会将此标记为完成。
推荐阅读
- php - notEqualTo in where cluase in zend
- sql - SQL Server - 根据条件从查询结果集中排除记录
- join - 如何组合来自多个算法输出的混淆矩阵?
- wordpress - Wordpress 类别循环无法检索 ACF 图像给出图像值:NULL
- pyspark - pySpark windows 分区 sortby 而不是 order by(感叹号)
- java - 如何使用 Keycloak authzClient 评估权限?
- laravel - 如何使用 laravel 将 HTML 转换为 PDF
- qt - 对 Qt5 和 C++17 容器的性能和内存使用情况进行基准测试
- python - 将 SPSS 26 python 设置为 Anaconda 用户创建的环境
- laravel - 使用 Laravel 使用保存方法插入关系