Node.js: express + MySQL实现修改密码
实现修改密码,本篇文章实现修改密码只考虑以下几个方面:
(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)// 查询成功 但条数不等于1if (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)// 查询成功 但条数不等于1if (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)// 查询成功 但条数不等于1if (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
相关文章:
Node.js: express + MySQL实现修改密码
实现修改密码,本篇文章实现修改密码只考虑以下几个方面: (1),获取旧密码 (2),获取新密码 (3),将获取到的旧密码与数据库中的密码进行比对…...
ArduPilot之433电传模块集成之H7Dual飞控Rx/Tx丝印问题
ArduPilot之433电传模块集成之H7Dual飞控Rx/Tx丝印问题 1. 源由2. 安装3. 排查3.1 电气连接3.2 软件配置3.3 模块测试3.4 通信测试3.5 定位问题 4. 总结5. 参考资料 1. 源由 鉴于最近iNav最新固件6.1.1出现远航炸机,还是回到相对可靠的Ardupilot,在Mavl…...
python爬虫优化手段
当使用Python进行网络资源爬取时,会涉及到网络请求、数据处理和存储等操作,这些操作可能会对电脑性能产生一定的影响。以下是一些关于Python爬取网络资源的常见注意事项: 网络请求频率:频繁的网络请求可能会对电脑性能产生较大的影…...
Bootstrap-学习文档
Bootstrap 简介 什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。 Bootstrap是前端开发中比较受欢迎的框架,简洁且灵活。它基于HTML、CSS和JavaScript,HTML定义页面元素,CSS定义页面布局&#x…...
【图像分类】CNN + Transformer 结合系列.1
介绍三篇结合使用CNNTransformer进行学习的论文:CvT(ICCV2021),Mobile-Former(CVPR2022),SegNetr(arXiv2307). CvT: Introducing Convolutions to Vision Transformers, …...
Stable Diffusion - 扩展 SegmentAnything 和 GroundingDINO 实例分割算法 插件的配置与使用
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131918652 Paper and GitHub: Segment Anything: SAM - Segment Anything GitHub: https://github.com/facebookresearch/s…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[基础知识]
分类目录:《自然语言处理从入门到应用》总目录 模型编程的新方法是使用提示(Prompts)。提示指的是模型的输入。这个输入通常由多个组件构成。PromptTemplate负责构建这个输入,LangChain提供了多个类和函数,使得构建和处…...
Elasticsearch-增删改查数据工作原理
集群 集群的基本概念: 集群:ES 集群由一个或多个 Elasticsearch 节点组成,每个节点配置相同的 cluster.name 即可加入集群,默认值为 “elasticsearch”。节点:一个 Elasticsearch 服务启动实例就是一个节点ÿ…...
IO进、线程——守护进程
守护进程 守护进程的创建过程 1、创建子进程,并退出父进程: 守护进程的创建通常通过fork()系统调用实现。fork()会创建一个新的子进程,该子进程是调用进程(父进程)的副本。父进程会继续执行fork()之后的代码&#x…...
通过v-for生成的input无法连续输入
部分代码:通过v-for循环生成el-form-item,生成多个描述输入框 更改之前的代码(key绑定的是item): <el-form-item class"forminput" v-for"(item,index) in formdata.description" :key"…...
Ventoy 使用教程图文详细版
文章目录 Ventoy 使用教程图文详细版简介安装 Ventoy下载 Ventoy制作基于 Ventoy 的启动U盘使用 Ventoy复制 ISO 文件启动电脑选择 ISO 文件结论Ventoy 使用教程图文详细版 简介 Ventoy 是一款开源的 U盘 启动工具,设计用于简化从 U盘 启动操作系统的过程。其中最主要的特点是…...
脚手架 --- command框架<一>
版本:6.0.0 假设脚手架名称:big-cat-cli 实例化 const commander require(commander) const program new commander.Command()program 基本信息配置 program.name(Object.keys(pkg.bin)[0]) // 赋值name, 显示在useage 前部分.usage(<command>…...
SpringBoot整合Zookeeper
引入Jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>s…...
Java和C#选哪个?
选择语言是一个非常重要的决定,因为它可能会对你的职业生涯产生深远的影响。C#和Java都是非常流行的编程语言,它们都有自己的优点和适用场景。 可以从下面几个方面来考虑: 1、就业前景: 就业前景是选择专业时需要考虑的一个非常…...
首批!棱镜七彩通过汽车云-汽车软件研发效能成熟度模型能力评估
2023年7月25-26日,由中国信息通信研究院、中国通信标准化协会联合主办的“2023年可信云大会”隆重召开。会上,在中国信息通信研究院云计算与大数据研究所副所长栗蔚的主持下,中国信通院发布了“2023年上半年可信云评估结果”,并由…...
【Docker】容器的数据卷
目录 一、数据卷的概念与作用 二、数据卷的配置 三、数据卷容器的配置 一、数据卷的概念与作用 在了解什么是数据卷之前我们先来思考以下这些问题: 1.如果我们一个容器在使用后被删除,那么他里面的数据是否也会丢失呢?比如容器内的MySQL的…...
CentOS7安装jenkins
一、安装相关依赖 sudo yum install -y wget sudo yum install -y fontconfig java-11-openjdk二、安装Jenkins 可以查看官网的安装方式 安装官网步骤 先导入jenkins yum 源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo…...
Hadoop的伪分布式安装方法
实验环境: 操作系统:Linux (Ubuntu 20.04.5) Hadoop版本:3.3.2 JDK版本:1.8.0_162 hadoop与jdk的安装包可详见博客中: https://blog.csdn.net/weixin_52308622/article/details/131947961?spm1001.2014.3001.550…...
iOS 应用上架的步骤和工具简介
APP开发助手是一款能够辅助iOS APP上架到App Store的工具,它解决了iOS APP上架流程繁琐且耗时的问题,帮助跨平台APP开发者顺利将应用上架到苹果应用商店。最重要的是,即使没有配置Mac苹果机,也可以使用该工具完成一系列操作&#…...
【信号去噪】基于马氏距离和EDF统计(IEE-TSP)的基于小波的多元信号去噪方法研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
ArcGIS Pro脚本工具实战:一键自动化面要素数据质量检查与修复
1. 为什么需要自动化面要素质检工具 在GIS数据处理工作中,面要素的质量检查是个绕不开的痛点。我做过不少国土调查和城市规划项目,每次拿到甲方提供的原始数据,光是检查拓扑错误就得花上大半天。传统的手动检查流程有多繁琐呢?你得…...
PX4仿真环境下的XTDrone实战:解决roslaunch常见错误的5个技巧
PX4仿真环境下的XTDrone实战:解决roslaunch常见错误的5个技巧 在无人机开发领域,PX4与ROS的结合为开发者提供了强大的仿真和测试平台。XTDrone作为基于PX4和ROS的开源无人机仿真框架,已经成为许多开发者和研究团队的首选工具。然而࿰…...
实战应用:为团队部署即装即用的中文版mobaxterm统一环境
在团队协作开发中,统一开发环境配置是个常见痛点。最近我们团队就遇到了这个问题:新成员加入时,每个人都要手动配置MobaXterm的中文界面、服务器连接、工具集等,既费时又容易出错。经过实践摸索,我总结出一套用脚本自动…...
3步搞定电脑风扇噪音!FanControl风扇控制软件完全指南,让你的电脑从此安静如新!
3步搞定电脑风扇噪音!FanControl风扇控制软件完全指南,让你的电脑从此安静如新! 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项…...
GetQzonehistory终极指南:三步永久备份你的QQ空间数字记忆
GetQzonehistory终极指南:三步永久备份你的QQ空间数字记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否也曾翻看QQ空间,发现那些承载青春记忆的说说正在…...
新手福音:在快马用ai生成你的第一个notepad编程入门项目
作为一个刚接触编程的新手,我完全理解那种面对空白编辑器时的迷茫感。还记得第一次想用Notepad写代码时,光是下载安装就折腾了半天。今天分享一个超实用的方法,用InsCode(快马)平台就能一键生成完整的入门指南,把下载、安装、写第…...
在Jetson Orin Nano上手动编译部署AirSLAM:如何解决TensorRT模型转换(ONNX转Engine)的内存溢出问题
在Jetson Orin Nano上手动编译部署AirSLAM:解决TensorRT模型转换内存溢出的实战指南 1. 边缘设备部署AirSLAM的核心挑战 Jetson Orin Nano作为NVIDIA面向边缘计算推出的高性能模块,其4GB/8GB内存配置在运行复杂视觉SLAM算法时面临严峻的资源约束。AirSLA…...
弧形导轨精度等级适配策略
弧形导轨是用于实现曲线运动的线性导向装置,广泛应用于自动化设备、机器人、医疗机械等领域。弧形导轨作为机械传动中的核心部件,其精度等级直接影响设备性能与稳定性。从精密加工到重型机械,不同场景对导轨的制造精度、运行精度及耐磨性要求…...
学习---3
有序数组的排序:一、暴力解法:思路:遍历数组,对每个数组元素进行平方,再用sort排序。时间复杂度:O(nlog n)二、双指针解法:思路:如果有序数组中有负数,那么这个负数平方之…...
用快马平台5分钟构建qoderwork理念下的待办事项应用原型
最近在研究qoderwork这个概念,简单来说就是通过AI辅助快速把想法变成可运行的代码原型。正好用InsCode(快马)平台试了下做个待办事项应用,整个过程比想象中顺畅很多,分享下具体实现思路。 整体框架搭建 首先确定基础HTML结构,分为…...
