Node.js: express + MySQL实现修改密码

news2024/11/26 2:28:05

        实现修改密码,本篇文章实现修改密码只考虑以下几个方面:

        (1),获取旧密码

        (2),获取新密码

        (3),将获取到的旧密码与数据库中的密码进行比对(避免修改错用户)

        (4),新密码与进密码进行比对,新密码和旧密码不能相同

        (5),将新密码加密存入数据库中

        另外的一些点就不考虑了。

        在我的这篇博客(Node.js: express + MySQL实现注册登录,身份认证_express连接mysql数据库注册登陆_掉头发类型的选手的博客-CSDN博客)中写到,注册时用到  bcryptjs  这个包对密码进行加密,所以在修改密码时也需要用到包进行密码的比较和对新密码进行加密。

        从前端接收的值,id(判断修改哪个用户的密码),oldPwd(旧密码),newPwd(新密码),会存储到 req 中。

        文件中写的是修改密码的函数,路径可以看我之前关于注册的文章,将路径和他的执行函数分开编写。便于管理。

// 修改密码
exports.updatePassword = (req, res) => {
    console.log(req);
}

        (1),根据id值获取数据库中需要修改的密码

exports.updatePassword = (req, res) => {
    console.log(req);
    // 根据id查询用户信息
    const sql = 'select * from ev_users where id=?'
    // 执行sql语句
    db.query(sql, req.user.id, (err, results) => {
        // 查询出错
        if (err) return res.cc(err)
        // 查询成功 但条数不等于1
        if (results.length !== 1) return res.cc('用户不存在')
        console.log(results[0].password);
    })
}

        根据id去查询需要修改的数据,如果查询出错或用户不存在做一下处理,如果查询成功,        results[0].password  就是数据库中存储的加密后的密码。

        (2),之后从 req 中获取到的密码和数据库中存储的密码进行比较,是否一致,比较可以使用  bcryptjs  包中的一个方法(bcryptjs 是存储密码时对密码进行加密使用的包),compareSync方法。

exports.updatePassword = (req, res) => {
    console.log(req);
    // 根据id查询用户信息
    const sql = 'select * from ev_users where id=?'
    // 执行sql语句
    db.query(sql, req.user.id, (err, results) => {
        // 查询出错
        if (err) return res.cc(err)
        // 查询成功 但条数不等于1
        if (results.length !== 1) return res.cc('用户不存在')
        // 判断用户输入的旧密码是否正确
        // 不能直接判断  数据库中存加密后的密码
        const compareResult = bcryptjs.compareSync(req.body.oldPwd, results[0].password)
        if (!compareResult) return res.cc('旧密码错误!')
    })
}

        使用  bcryptjs.compareSync(req.body.oldPwd, results[0].password)  就可以对获取的旧密码和数据库中存储的密码进行比较。相同会返回true,不同返回false。

        (3)将新密码和数据库中的密码进行比较,新密码不能和原密码相同。

第一种判断方法

const sameCompare = bcryptjs.compareSync(req.body.newPwd, results[0].password)
if (sameCompare) return res.cc('新密码不能和原密码相同!')

第二种判断方法

        在注册登录那篇文章中写到有两个包,@escook/express-joi(自动对表单数据进行验证),joi(字段规则),也可以用这两个包进行新旧密码的判断。

// 导入定义验证规则的包
const joi = require('joi')

// 字符串类型,匹配正则,必输
const password = joi.string().pattern(/^[\S]{6,12}$/).required()

exports.update_password_schema = {
    body: {
        // 旧密码使用 password 这个规则
        oldPwd: password,
        // 新密码不能等于旧密码,但也得符合密码的规则
        // joi.ref('')  与括号中的值保持一致
        newPwd: joi.not(joi.ref('oldPwd')).concat(password),
    }
}

        之后在路由处使用。

// 导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
const { update_password_schema } = require('../schema/user')

// 重置密码
router.post('/updatePwd', expressJoi(update_password_schema), userInfo_handler.updatePassword)

        如果输入一致的话会返回:

        (4)之后就可以将新密码加密存储到数据库中。

        先将新密码加密,然后再使用  update  语句将密码存储到数据库中。这个接口所有的代码:

// 重置密码
exports.updatePassword = (req, res) => {
    // console.log(req);
    // 根据id查询用户信息
    const sql = 'select * from users where id=?'
    // 执行sql语句
    db.query(sql, req.user.id, (err, results) => {
        // 查询出错
        if (err) return res.cc(err)
        // 查询成功 但条数不等于1
        if (results.length !== 1) return res.cc('用户不存在')
        // 判断用户输入的旧密码是否正确
        // 不能直接判断  数据库中存加密后的密码
        const compareResult = bcryptjs.compareSync(req.body.oldPwd, results[0].password)
        if (!compareResult) return res.cc('旧密码错误!')
        // 将新密码更新到数据库中
        // 更新密码sql语句
        const sql = 'update users set password=? where id=?'
        // 对新密码进行加密处理
        const newPwd = bcryptjs.hashSync(req.body.newPwd, 10)
        db.query(sql, [newPwd, req.user.id], (err, results) => {
            // 执行sql语句失败
            if (err) return res.cc(err)
            // 执行成功 但修改的条数不为1,没有修改
            if (results.affectedRows !== 1) return res.cc('修改密码失败')
            // 修改密码成功
            res.cc('修改密码成功', 0)
        })
    })
}

        可以到下面链接获取文章中的代码。

        链接: https://pan.baidu.com/s/1t7bX0Nv3kggyf7IFzEffcA 提取码: 0000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IC 后端 corner 介绍

在数字IC后端,有对晶体管的偏差建模的PVT corner,以及对互连线偏差建模的RC corner。 芯片的延迟一般受到三个因素的影响:工艺(Process)、电压(Voltage)、温度(Temperature&#xff…

rabbitmq是什么?rabbitmq安装、原理、部署

rabbitmq是什么? MQ的全称是Messagee Queue,因为消息的队列是队列,所以遵循FIFO 先进先出的原则是上下游传递信息的跨过程通信机制。 RabbitMQ是一套开源(MPL)新闻队列服务软件由 LShift 提供的一个 Advanced Messag…

linux学成之路(基础篇)(二十一)nfs服务器

前言 NFS是Network File System的缩写,它是一种在计算机网络中共享文件和文件系统的协议。NFS允许不同的计算机系统之间通过网络访问、读取和写入远程文件,就像访问本地文件一样。它是一种基于客户端-服务器体系结构的协议,其中一个计算机充当…

Python(三十五)pass语句

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

excel中的vlookup如何实现根据多个条件查找?

目录 简述问题公式思路通用公式三条件查找公式实例 简述 Excel 中根据一个条件查找非常方便,Excel 提供了内置函数 VLOOKUP。但是实际中往往有多种情形,需要根据多个条件进行查找操作,目前没有现成的内置函数。 本篇介绍 VLOOKPCHOOSE 组合…

SpringBoot读取配置的几种方式

SpringBoot读取配置的方式有多种,这里介绍6种 1.第一种Value 注意:static和final修饰的变量不生效 2.通过ConfigurationProperties(prefix“”) 适用于对对象多个变量统一绑定,比Value高效 3.通过Environment Sprin…

信创环境下,使用国产服务器如何进行文件高速可靠传输?

信创,即信息技术应用创新,2018年以来,受“华为、中兴事件”影响,国家将信创产业纳入国家战略,并提出了“28n”发展体系。从产业链角度,信创产业生态体系较为庞大,主要包括基础硬件、基础软件、应…

堆和栈的区别以及栈的顺序存储和链式存储—Python数据结构(三)

栈 一、栈 1. 定义 栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈), 允许进行操作的一端称为”栈顶“,另一固定端称为”栈底“,当栈中没有元素时称为”空栈“。 2. 特点 栈只能在一端进行操作。 栈模型具有先进后出&#xff…

基于jeecg-boot的任务甘特图显示

更多功能看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 基于项目的任务显…

Redis项目 PART1

第一部分:含注册登入商户查询(使用缓存) 一、注册登入 1.1 session共享问题 使用redis而不用传统的session的原因(session共享问题):每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#x…

网络子系统学习3:网络访问层

目录 网络访问层 网络设备的表示 数据结构 注册网络设备 接收分组 传统方法 对高速接口的支持 发送分组 网络访问层 网络实现的第一层,即网络访问层。该层主要负责在计算机之间传输信息,与网卡的设备驱动程序直接协作。 本次不会讲驱动程序的设计…

全面助力AI人工智能在科研、教学与实践技能

目录 模块一 编程入门与进阶提高 模块二 科研数据可视化 模块三 信息检索与常用科研工具 模块四 科技论文写作与技巧 模块五 数据预处理与特征工程 模块六 多元线性回归 模块七 机器学习 模块八 深度学习 模块九 答疑讨论 更多推荐 在人工智能领域进行研究和深耕&…

PCB封装设计指导(十二)画出器件禁布,过孔走线禁布

PCB封装设计指导(十二)画出器件禁布,过孔走线禁布 对于分离器件或者Datasheet中有标注出走线或者过孔禁布,在封装中需要把这些信息体现出来,如何添加,见如下说明 1. 一般来讲,只有分离器件,比如电阻,电容,晶振才会在中间加上route keepout 和via keepout Via keep o…

Qt与opencv学习记录2

我希望把这篇文章中的效果实现。 【Qt学习】 OpenCV美图特效_qt图像处理_顾城沐心的博客-CSDN博客 问题1: 我发现是因为我使用的是MSVC2017 32位套件,改为MSVC2017 64位套件debug就好了。 感觉这是因为我选用的lib库也是64位的。 E:\opencv454\opencv…

使用STM32 再实现PWM小车两轮分别调速

关于PWM调速的原理,其实在之前89C52开发小车的时候也已经详细的描述过,所以主要的区别还是STM32和89C52的PWM实现区别。 关于STM32的PWM实现,是从CubeMX的配置开始的: CubeMX 1. 在上节的CubeMX项目基础上进行修改 2. 两路PWM分…

2023牛客暑期多校训练营2

题目顺序不分难度 KBox 状态dp,因为每个棋子只能移动到 i-1 到 i1的位置,所以直接用4个状态表示棋子在哪 f[i][0] 表示前i个位置中,i-1到i1都没有棋子 f[i][1] 表示前i个位置中,i-1有棋子 f[i][2] 表示前i个位置中&#xff0…

Autosar - PDUR简介与配置

文章目录 一、PDUR是什么二、不同报文类型的信号流ECUC(EcucPduCollection)三、时序图CanIfs之间的路由CanIf与Com之间的路由CanTp通道间的路由一、PDUR是什么 PDU Router(路由器)在本文将简称为PduR,在AUTOSAR的架构中,通信部份中很重要的一个模块就是PduR,它能将IPdu…

C++: day6

1 思维导图 2 顺序栈模板和顺序队列模板 #include <iostream>using namespace std;template <typename T> class My_stack { private:T *ptr; //指向堆区空间int top; //记录栈顶元素public://无参构造My_stack():ptr(new T[10]), top(-1){}//有参构造My_sta…

ROS-Moveit机械臂追踪二维码(四)

ROS-Moveit机械臂追踪二维码(四) 在仿真环境增加相机 <gazebo reference"camera_depth_frame"><sensor name"camera1" type"depth"><always_on>true</always_on><update_rate>20.0</update_rate><came…

多路选择器设计实现

文章目录 一、多路选择器二、二选一多路选择器三、四选一多路选择器设计 一、多路选择器 多路选择器是数据选择器的别称。在多路数据传送过程中&#xff0c;能够根据需要将其中任意一路选出来的电路&#xff0c;叫做数据选择器&#xff0c;也称多路选择器或多路开关。 二、二…