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})
    //判断影响行数是否为1
    if(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语句执行成功,但影响行数不为1
            if(results.affectedRows!==1) return res.send({status:1,message:'更新密码失败'})
            res.send({status:0,message:'密码更新成功'})
        })
    })
}

使用postman模拟发送请求

用户b,原密码为000000

当输入错误的原密码时

输入正确的原密码时

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络协议--IGMP:Internet组管理协议

13.1 引言 12.4节概述了IP多播给出,并介绍了D类IP地址到以太网地址的映射方式。也简要说明了在单个物理网络中的多播过程,但当涉及多个网络并且多播数据必须通过路由器转发时,情况会复杂得多。 本章将介绍用于支持主机和路由器进行多播的In…

软件测试工程师怎么样面试上好的公司?

首先卖个关子,如果你是面试官,你希望招一个什么样的人进来? 如果这个问题搞明白了,那么可以说测试岗位的面试,就变得非常轻松了。 按照一般的惯例,面试官都会让你自我介绍,介绍你的项目经验&a…

【JAVA核心知识】深度了解MySql的innodb引擎

关键词InnoDB架构图表空间数据页顺序下数据页的存储页分裂页合并高水位排序索引构建img_v2_455d98d3-a67a-47ef-b15a-c1798de6f56g.jpg 索引优化模糊查询打断最左匹配?-索引下推仅能使用一个索引?-索引合并自适应Hash索引 AUTO_INCREMENT计数器新增语句的…

正点原子嵌入式linux驱动开发——Linux LCD驱动

LCD是很常用的一个外设,通过LCD可以显示绚丽的图片、界面等,提交人机交互的效率。STM32MP1提供了一个LTDC接口用于连接RGB接口的液晶屏。本章就来学校一下如何在Linux下驱动LCD屏。 LCD和LTDC简介 LCD简介 这里在当时学习stm32裸机开发的时候就学过了…

C++文件和流

到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream,它定义了三个新的数据类型&#x…

JavaWeb——IDEA相关配置(Maven配置以及创建自己的第一个Maven项目)

写在前面: 笔者根据狂神说的javaweb视频,一步一步跟着配置IDEA中的Maven,在后面,笔者将讲述自己如何从0配置Maven以及创建自己的第一个Maven项目,笔者将自己的心路历程,包括配置的过程,都以文字…

【TGRS 2023】RingMo: A Remote Sensing Foundation ModelWith Masked Image Modeling

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling, TGRS 2023 论文:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9844015 代码:https://github.com/comeony/RingMo MindSpore/RingMo-Framework (gitee.com) …

汽车4S店如何在数字化管理下,提高市场竞争力

在所有人都认为疫情过后,经济形势会一路向阳,但是,实际情况出乎所有人的意料,各行各业举步维艰。 新闻爆出的各大房地产,恒大的2.4万亿让人瞠目结舌,还有碧桂园和融创,也是债台高筑了&#xff…

嵌入式 Tomcat 调校

SpringBoot 嵌入了 Web 容器如 Tomcat/Jetty/Undertow,——这是怎么做到的?我们以 Tomcat 为例子,尝试调用嵌入式 Tomcat。 调用嵌入式 Tomcat,如果按照默认去启动,一个 main 函数就可以了。 简单的例子 下面是启动…

Power BI 傻瓜入门 9. 设计和部署数据模型

本章内容包含: 详细说明设计数据模型的技术要求Power BI Desktop中基本数据模型的设计将数据模型从Power BI Desktop发布到Power BI Services 在数据进入Power BI后对其进行操作既是一门艺术,也是一门科学。导入到任何应用程序中的数据不仅需要注意数据…

从力扣[203]理解递归思想

本文旨在通过使用递归方法的使用来进一步了解递归思想 class Solution {public ListNode removeElements(ListNode head, int val) {if (head null) {return head;}head.next removeElements(head.next, val);return head.val val ? head.next : head;} }既然要使用递归算法…

【golang】Go中的切片slice和操作笔记,垃圾回收机制,重组 reslice ,复制和追加,内存结构

切片 文章目录 切片将切片传递给函数make() 创建一个切片new() 和 make()的区别多维切片bytes包for-range切片重组 reslice切片的复制和追加 字符串、数组和切片的应用获取字符串的某一部分字符串和切片的内存结构修改字符串中的某个字符字节数组对比函数搜索及排序切片和数组a…

一、PHP环境搭建[phpstorm]

一、安装 1.php编写工具 地址:https://www.jetbrains.com/phpstorm/download/#sectionwindows 图示: 2.php环境 解释:建议使用phpstudy进行安装,安装较为简单 链接:https://www.xp.cn/ 图示: 二、第…

微信小程序投票管理系统:打造智能、便捷的投票体验

前言 随着社交网络的兴起和移动互联网的普及,人们对于参与和表达意见的需求越来越强烈。在这个背景下,微信小程序投票管理系统应运而生。它为用户提供了一个智能、便捷的投票平台,使用户可以轻松创建和参与各种类型的投票活动。本文将详细介…

【德哥说库系列】-PostgreSQL跨版本升级

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

STM32-LCD中英文显示及应用

目录 字符编码 ASCII码(8位) 中文编码(16位) GB2312标准 GBK编码 GB18030标准(32位) Big5编码 Unicode字符集和编码 UTF-32(32位) UTF-16(16位/32位&#xff0…

[AutoSar NVM] 存储架构

依AutoSAR及公开知识辛苦整理,禁止转载。 专栏 《深入浅出AutoSAR》, 全文 2900 字. 图片来源: 知乎 汽车的ECU内存中有很多不同类型的变量,这些变量包括了车辆各个系统和功能所需的数据。大部分变量在ECU掉电后就会丢失&#x…

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能(AI)中,"Prompt"通常指的是向AI系统提供的输入或指令,用于引导AI进行特定的操作或生成特定的输出。例如,在一个对话型AI系统中,用户输入的问题就是一个prompt&…

高校教务系统登录页面JS分析——西安科技大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习,勿用于非法用途。 一、密码加…

《数字图像处理》作业一:题目+学习笔记

Hi,学习进步,共同加油💪 1、选择题 (每小题3分,总计24分) (1)下列哪种图像属于数字图像( ) A、电影胶片;B、普通照片;C、手机拍照;D、眼前看到的景物 数字图像是由离散的像素点组成的图像,可以通过数值表示。根据选项,可以排除A(电影胶片)和B(普通…
最新文章