Node编写重置用户密码接口
目录
前言
定义路由和处理函数
验证表单数据
实现重置密码功能
前言
接前面文章,本文介绍如何编写重置用户密码接口
定义路由和处理函数
路由
// 重置密码的路由
router.post('/updatepwd', userinfo_handler.updatePassword)
处理函数
exports.updatePassword=(req,res)=>{res.send('重置成功')
}
postman验证

需要在headers中添加请求头authorization,并且加上在登录时生成的token值

验证表单数据
定义验证规则对象并将其导出
// 验证规则对象 - 重置密码
exports.update_password_schema = {body: {// 使用 password 这个规则,验证 req.body.oldPwd 的值oldPwd: password,// 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则,验证 req.body.newPwd 的值// 解读:// 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致// 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值// 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则newPwd: joi.not(joi.ref('oldPwd')).concat(password),},
}
导入验证规则对象
// 导入需要的验证规则对象
const { update_password_schema } = require('../schema/user')
在重置密码路由中添加验证
//重置用户密码router.post('/updatePwd',expressJoi(update_password_schema),userinfo_handler.updatePassword)
使用postman,当原密码与密码相同时

实现重置密码功能
定义sql语句
const sql = 'select * from ev_users where id=?'
db.query()调用sql语句
db.query(sql,req.auth.id,(err,results)=>{//判断sql语句是否正确if(err) return res.send({status:1,message:err.message})//判断影响行数是否为1if(results.length!==1) return res.send({status:1,message:'密码重置失败'})res.send('密码重置成功')
})
导入bcryptjs密码加密模块
const bcrypt = require('bcryptjs')
判断原密码是否正确
// 判断提交的旧密码是否正确
const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
if (!compareResult) return res.cc('原密码错误!')
对新密码加密,定义新的更新密码的sql语句并对sql语句操作
对新密码加密
const newPwd = bcrypt.hashSync(req.body.newPwd,10)
定义sql语句
const sql = 'update ev_users set password =? where id =?'
使用db.query()调用sql语句
db.query(sql,[newPwd,req.auth.id],(err,results)=>{if(err) return res.send({status:1.message:err.message})if(results.affectedRow!==1) return res.send({status:1,message:'更新密码失败'})res.send({status:0,message:'密码更新成功'})
})
重置密码接口完整代码
// 导出重置用户密码
exports.updatePassword=(req,res)=>{// 定义sql语句const sql = 'select * from ev_users where id=?'db.query(sql,req.auth.id,(err,results)=>{// 判断sql语句是否正确if(err) return res.send({status:1,message:err.message})// 检查id是否存在if(results.length!==1) return res.send({status:1,message:'该用户不存在'})// 验证密码是否正确const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)if(!compareResult) return res.send({status:1,message:'原密码错误'})// 定义sql语句const sql = 'update ev_users set password =? where id = ?'// 对新密码进行加密const newPwd = bcrypt.hashSync(req.body.newPwd,10)// 执行sql语句,根据id查找db.query(sql,[newPwd,req.auth.id],(err,results)=>{// sql语句执行失败if(err) return res.send({status:1,message:err.message})// sql语句执行成功,但影响行数不为1if(results.affectedRows!==1) return res.send({status:1,message:'更新密码失败'})res.send({status:0,message:'密码更新成功'})})})
}
使用postman模拟发送请求
用户b,原密码为000000

当输入错误的原密码时

输入正确的原密码时

相关文章:
Node编写重置用户密码接口
目录 前言 定义路由和处理函数 验证表单数据 实现重置密码功能 前言 接前面文章,本文介绍如何编写重置用户密码接口 定义路由和处理函数 路由 // 重置密码的路由 router.post(/updatepwd, userinfo_handler.updatePassword) 处理函数 exports.updatePasswo…...
Day13力扣打卡
打卡记录 奖励最顶尖的 k 名学生(哈希表排序) 用哈希表对所有的positive与negative词条进行映射,然后遍历求解。tip:常用的分割字符串的操作:1.stringstream配合getline() [格式buf, string, char]2.string.find()[find未找到目标会返回npos…...
独立开发者知识贴
有一个github仓库,叫做独立开发变现周刊,很不错,作者能从21年能坚持更新到现在,我很佩服。 它里边有很多独立开发者成功的作品案例,我对这些很感兴趣。 在阅读时,我会问自己以下几个问题: 解…...
软考系列(系统架构师)- 2009年系统架构师软考案例分析考点
试题一 软件架构设计 【问题1】(9分) 软件质量属性是影响软件架构设计的重要因素。请用200字以内的文字列举六种不同的软件质量属性名称并解释其含义。 常见的软件质量属性有多种,例如性能(Performance)、可用性(Ava…...
C语言每日一题(21)删除排序数组中的重复项
力扣 26.删除排序数组中的重复项 题目描述 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考…...
如何快速解决d3dcompiler_43.dll缺失问题?五种方法快速解决
在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“D3DCompiler_43.dll缺失”。这个错误通常会导致游戏、应用程序或系统无法正常运行。为了解决这个问题,我们需要采取一些修复方案来恢复缺失的文件。本文将介绍五个修复D3DCompi…...
mongodb数据迁移的方法
这个方法只能将数据从一个mongo数据库转移到另一个mongo数据库 这个命令可以备份mongo数据(mongo数据库中的数据备份转换为文件) mongodump --host HOST --port PORT --username USERNAME --password PASSWORD --db DB -c COLLECTION --out OUT这个命令…...
Spring MVC 中文文档
1. Spring Web MVC Spring Web MVC是建立在Servlet API上的原始Web框架,从一开始就包含在Spring框架中。正式名称 “Spring Web MVC” 来自其源模块的名称( spring-webmvc),但它更常被称为 “Spring MVC”。 与Spring Web MVC并…...
RedissonCach的源码流程
上: https://blog.csdn.net/Michelle_Zhong/article/details/126384566 中: https://blog.csdn.net/michelle_zhong/category_11874153.html 下: https://blog.csdn.net/Michelle_Zhong/article/details/126391915?ops_request_misc%257B%…...
spring-基于注解管理bean
基于注解管理bean 一、标记与扫描1、引入依赖2、创建spring配置文件3、创建组件4、扫描组件4.1、基本扫描:4.2、指定要排除的组件4.3、仅扫描指定组件 二、基于注解的自动装配 一、标记与扫描 1、引入依赖 <dependencies> <!-- 基于Maven依赖传递性&…...
数据挖掘(7.1)--数据仓库
目录 引言 一、数据库 1.简介 2.数据库管理系统(DBMS) 二、数据仓库 数据仓库特征 数据仓库作用 数据仓库和DBMS对比 分离数据仓库和数据库 引言 数据仓库的历史可以追溯到20世纪60年代,当时计算机领域的主要工作是创建运行在主文件上的单个应用࿰…...
Vue3问题:如何实现密码加密登录?前后端!
前端功能问题系列文章,点击上方合集↑ 序言 大家好,我是大澈! 本文约3400字,整篇阅读大约需要6分钟。 本文主要内容分三部分,第一部分是需求分析,第二部分是实现步骤,第三部分是问题详解。 …...
【爬虫】python打包可执行程序(ui界面制作完成后)
1.安装pyinstaller pip install pyinstaller可能出现连接超时安装不上的情况,可以切换源进行下载 pip install -i http://pypi.douban.com/simple/ pyinstaller2.打包程序 pyinstaller xxxxx.py --noconsole --hidden-import PySide6.QtXml...
取Dataset子集(pytorch)
取Dataset子集--pytorch 1. why2. how3. example 1. why 我们在调试深度学习代码时,常常会遇到数据集太大,导致调试浪费时间的情况,这种情况下,将数据集中的一个子集拿出来用于调试代码,调试成功在用完整的数据集运行…...
如何选择消息队列
作为一个程序员,我们必须要认识到,软件工程中是不存在”银弹“的。<!--more--> 在消息队列的选型问题上,也是同样的道理。并不存在哪个消息队列就是最好的,能够解决所有的问题。常用的消息队列有好几个,每一种都…...
读取mysql数据库表结构生成接口文档
1、引入依赖 <!-- 导出word --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.30</version></dependency><!-- https://mvnrepository.com/artifact/e-iceblue/s…...
【MySQL索引与优化篇】InnoDB数据存储结构
文章目录 1. 数据库的存储结构:页1.1 磁盘与内存交互基本单位:页1.2 页结构概述1.3 页的上层结构 2. 页的内部结构3. InnoDB行格式(或记录格式)3.1 Compact行格式3.2 Dynamic和Compressed行格式3.3 Redundant行格式 4. 区、段与碎片区4.1 为什么要有区?4.2 为什么要…...
Go学习第十二章——Go反射与TCP编程
Go反射与TCP编程 1 反射1.1 基本介绍1.2 快速入门1.3 注意事项和细节说明1.4 最佳实践 2 Tcp Socket编程2.1 基本介绍2.2 入门案例2.3 服务器监听2.4 服务器接受客户端消息 1 反射 1.1 基本介绍 **反射:**在编译时静态类型语言中实现动态特性的一种机制。 Go语言…...
uniapp编译微信小程序富文本rich-text的图片样式不生效原因
this.detail.contents this.detail.contents.replace(/\<img/gi, <img style"display:block;max-width:90%;height:auto;border:2px solid #eee;box-shadow:5px 5px 5px rgba(100,100,100,0.8);margin-bottom:10px;text-align:center;" );开始采用这个replace…...
Django实战项目-学习任务系统-任务管理
接着上期代码框架,开发第3个功能,任务管理,再增加一个学习任务表,用来记录发布的学习任务的标题和内容,预计完成天数,奖励积分和任务状态等信息。 第一步:编写第三个功能-任务管理 1࿰…...
四款免费抓包工具实战选型指南:HTTPS解密与跨平台调试
1. 抓包这件事,为什么90%的人从一开始就搞错了方向 “免费抓包工具有哪些?”——这是我在技术群、论坛和私信里被问得最多的问题之一。但每次看到这个问题,我都会先反问一句:“你到底想抓什么包?” 不是所有抓包场景…...
20 万行代码,30 分钟理清——Understand Anything 让你的代码库变成一张可交互的知识图谱
加入新团队,面对二十万行代码库,从哪开始读?读完本文你可以:用 3 条命令把项目变成可交互知识图谱,理解 5 代理分析管线的运作原理,并判断这个工具适合不适合你的场景。 🎯 这个项目解决什么问题…...
3分钟快速解密QQ音乐加密音频:qmc-decoder终极解决方案
3分钟快速解密QQ音乐加密音频:qmc-decoder终极解决方案 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾在QQ音乐下载了心爱的歌曲,却发现只…...
终极指南:如何使用qmc-decoder快速解密QQ音乐加密音频文件
终极指南:如何使用qmc-decoder快速解密QQ音乐加密音频文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经从QQ音乐下载了心爱的歌曲,却发…...
解锁AMD Ryzen隐藏性能:一款开源调试工具如何让你成为硬件调优高手
解锁AMD Ryzen隐藏性能:一款开源调试工具如何让你成为硬件调优高手 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...
OpenAI大神教你如何榨干Codex
闻乐 发自 凹非寺量子位 | 公众号 QbitAI新晋员工确实毫无保留。Jason Liu,13k星开源库Instructor的作者,刚被OpenAI招进Codex团队没多久,不仅在社交平台大方发API额度;还写了篇Codex-maxxing,把自己的Codex玩法全抖出…...
5分钟快速上手:AMD Ryzen处理器硬件调试完整指南
5分钟快速上手:AMD Ryzen处理器硬件调试完整指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode…...
BabelDOC:3步搞定学术论文PDF翻译,公式表格完美保留!
BabelDOC:3步搞定学术论文PDF翻译,公式表格完美保留! 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 你是否正在为英文学术论文的阅读而烦恼?复杂…...
差分隐私下机器学习模型预处理完整性验证框架设计与实践
1. 项目概述:当模型审计遇上隐私保护在金融风控、医疗诊断这些对数据隐私和模型可靠性要求极高的领域,我们常常面临一个两难困境。一方面,一个机器学习模型在上线前,必须确保其训练流程是合规且完整的,尤其是数据预处理…...
稀疏矩阵:深度学习三大架构的统一数学语言
1. 稀疏矩阵:深度学习架构的统一数学语言在深度学习领域,卷积神经网络(CNN)、循环神经网络(RNN)和Transformer长期被视为三种截然不同的架构范式。但当我们透过表象看本质,会发现它们共享着相同的数学内核——稀疏矩阵运算。这种统一性不仅具…...
