使用 mongooseexpress 更新哈希密码

2023-12-10

我回顾了关于这个问题的许多讨论,但似乎没有一个对我有帮助。

我使用 mongoose 5.5 来保存用户数据,如下所示:

我的架构如下所示:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const bcrypt = require("bcryptjs");

const userSchema = Schema({

  userName: {
    type: String
  },
  firstName: {
    type: String
  },
  surName: {
    type: String
  },
  password: {
    type: String,
    required: true
  }
});

userSchema.pre('save', async function(next){

try {
  if(!this.isModified('password')){
      return next();
  }
  const hashed = await bcrypt.hash(this.password, 10);
  this.password = hashed;

} catch (err) {
    return next(err);
  }
});

module.exports = user;

我的注册码如下所示:

exports.register = async (req, res, next) => {

try {
    const user = await db.user.create(req.body);
    const {id, username} = user;
    res.status(201).json({user});
    
} catch (err) {
    if(err.code === 11000){
        err.message ='Sorry, details already taken';
    }
    next(err);
  }
};

登录代码如下所示:

exports.login = async (req, res, next) => {

try {
    const user = await db.user.findOne({username: req.body.username});
    const valid = await user.comparePasswords(req.body.password);

    if(valid){

        const token = jwt.sign({id, username}, process.env.SECRET);
        res.json({id, username, token});
    }
    else{
        throw new Error();
    }        
    
} catch (err) {
    err.message = 'Invalid username/password';
    next(err);
  } 
};

注册和登录效果很好,我的挑战是更新密码。我想将当前密码与用户提供的密码(例如登录时)进行比较,如果有效则更新新密码。

像这样的东西:

exports.changepass = async (req, res, next) => {
    const user = await db.user.findOne({username: req.body.username});
    const valid = await user.comparePasswords(req.body.password);

    if(valid){

           " ?? update password and hash ?? "
    }
    else{
        throw new Error();
    }       

}

如果您正在使用findOneAndUpdate()要更新,请尝试使用pre("findOneAndUpdate")中间件来修改类似于您的密码pre("save"). The pre("findOneAndUpdate")每次使用时都会调用中间件Model.findOndAndUpate()更新您的模型。

你可以用同样的方法updateOne() with pre("updateOne")

Sample:

// userSchema--------------------
...
userSchema.pre('save', async function (next) {
    try {
        if (!this.isModified('password')) {
            return next();
        }
        const hashed = await bcrypt.hash(this.password, 10);
        this.password = hashed;
    } catch (err) {
        return next(err);
    }
});

userSchema.pre('findOneAndUpdate', async function (next) {
    try {
        if (this._update.password) {
            const hashed = await bcrypt.hash(this._update.password, 10)
            this._update.password = hashed;
        }
        next();
    } catch (err) {
        return next(err);
    }
});

// changepass--------------------
...
if(valid){

    //" ?? update password and hash ?? "
    const result = await db.user.findOneAndUpdate(
        { username: req.body.username },
        { password: req.body.newPassword },
        { useFindAndModify: false }
    ); 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 mongooseexpress 更新哈希密码 的相关文章

  • 环回关系不填充对象 ID 数组

    到目前为止我有 2 个模型 工作流程核心 工作流程步骤 工作流核心有一个steps属性 该属性是数组类型并且包含1 多个步骤 当呼叫接通时工作流程核心响应正文不会使用实际步骤对象填充步骤数组 工作流程核心 json name workflo
  • Flask 不加载配置

    我在 Flask 中加载配置时遇到问题 from config import config DevelopmentConfig TestingConfig ProductionConfig def create app config nam
  • 清理 MongoDB 的输入

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • MongoDB 存储过程等效项

    我有一个包含商店列表的大型 CSV 文件 其中一个字段是邮政编码 我有一个名为 ZipCodes 的独立 MongoDB 数据库 它存储任何给定邮政编码的纬度和经度 在 SQL Server 中 我将执行一个名为 InsertStore 的
  • MongoDB Java 嵌套文档无法使用键名中的点进行访问

    当在Java中使用MongoDB API时 我试图检索以下值two在如下所示的文档中 data id 1234 one two three 我正在运行这个 MongoCollection
  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • 我可以重复使用express.js错误视图吗?

    当express找不到视图时 它会出错并 在调试模式下 呈现一个漂亮的页面 有没有一种方便的方法来重新使用该视图来显示我自己的错误消息 我不知道如何重用该视图 但您可以使用 error stack 来呈现堆栈跟踪 我有这样的事情 app a
  • Multer 使用数据创建新文件夹

    I use multer https github com expressjs multer 问题1 当我将以下代码片段放入app js app use multer dest uploads single file 它在根文件夹下创建一个
  • GraphQL - POST 正文丢失。您忘记使用 body-parser 中间件了吗?

    我的电脑上不断出现以下错误graphql查询但不确定原因 POST body missing Did you forget use body parser middleware 我在这里做了什么奇怪的事吗 我已经尝试了在线 body par
  • mongodb 中的 Redact 对我来说似乎很晦涩

    我现在正在与 redact 作斗争 我不确定是否理解它 我刚刚阅读了文档并尝试在集合成绩上使用 redact 它来自 mongodb 在线培训 grades 集合中的文档如下所示 id ObjectId 50b59cd75bed76f465
  • 使用 python 字典更新 MongoEngine 文档?

    是否可以使用 python 字典更新 MongoEngine 文档 例如 class Pets EmbeddedDocument name StringField class Person Document name StringField
  • 使用 Typescript 实现 Express 控制器类

    我正在用打字稿做一个快速应用程序 路由器代码是 let user new User router get user test 用户类别是 export class User test req res next this undefined
  • 设置ejs在express中查看文件夹的查找路径

    I have app js in Express 服务器文件夹 aap js 的完整位置是I WEB Development Node Express server 我做了views该位置的文件夹I WEB Development Node
  • 如何确定 STARTUP2 BTree Bottom Up 步骤的总体进度?

    确定新次要成员的初始同步 STARTUP2 的索引构建阶段的总体进度的好方法是什么 在我的例子中 索引构建阶段需要很长时间 几天 如果能够看到它在这个过程中的进度 那就太好了 日志输出如下所示 Tue Jan 27 20 04 45 006
  • Socket.io、集群、快速和同步事件

    1周以来我遇到了一个大问题 我尝试将实际在单核上运行的 node JS 项目转换为具有集群的多核 对于 websockets 目前 我对事件没有任何问题 但是 对于 xhr polling 或 jsonp polling 我在集群模式下使用
  • 如何使用 ejs post 表单更新 node.js 和 MongoDB 应用程序中的现有用户数据?

    我对 javascript 非常陌生 发现 Brad Traversy 的视频 Node js with Passport Authentication 并关注了他的视频 它对我有用 但后来我想添加更多 我创建了自定义仪表板和导航 我添加的
  • mongodb在单个操作中进行多个聚合

    我有一个包含以下文档的项目集合 item i1 category c1 brand b1 item i2 category c2 brand b1 item i3 category c1 brand b2 item i4 category
  • 模块转换为 Typescript 后没有默认导出

    我已将 JavaScript 代码转换为 Typescript 并收到错误 模块没有默认导出 我尝试过使用花括号导入并使用 module exports 导出 但它们都不起作用 contactController ts const cont
  • PyMongo 中的 MapReduce

    我的蒙戈收藏 Impressions具有以下格式的文档 uid 10 impressions pos 6 id 123 service furniture pos 0 id 128 service electronics pos
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以

随机推荐