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)
        // 查询成功 但条数不等于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个使用 Node.js + Express + MySQL 实现博客系统的示例代码。需要注意的是,这只是一个简单的示例,实际应用中需要根据具体需求进行修改和完善。 app.js: ```javascript const express = require('express'); const bodyParser = require('body-parser'); const mysql = require('mysql'); const app = express(); const port = 3000; app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); // 创建数据库连接 const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'blog' }); // 连接数据库 connection.connect((err) => { if (err) { console.error('error connecting: ' + err.stack); return; } console.log('connected as id ' + connection.threadId); }); // 引入路由 const blogRouter = require('./routes/blog'); app.use('/api/blog', blogRouter(connection)); app.listen(port, () => { console.log(`App listening at http://localhost:${port}`) }); ``` routes/blog.js: ```javascript const express = require('express'); const router = express.Router(); module.exports = (connection) => { // 获取所有博客列表 router.get('/', (req, res) => { const sql = 'SELECT * FROM blog'; connection.query(sql, (err, results) => { if (err) throw err; res.send(results); }); }); // 获取指定博客 router.get('/:id', (req, res) => { const id = req.params.id; const sql = `SELECT * FROM blog WHERE id = ${id}`; connection.query(sql, (err, results) => { if (err) throw err; res.send(results[0]); }); }); // 新增博客 router.post('/', (req, res) => { const { title, content } = req.body; const sql = `INSERT INTO blog (title, content) VALUES ("${title}", "${content}")`; connection.query(sql, (err, results) => { if (err) throw err; res.send(`新增博客:${title}, ${content}`); }); }); // 修改指定博客 router.put('/:id', (req, res) => { const id = req.params.id; const { title, content } = req.body; const sql = `UPDATE blog SET title="${title}", content="${content}" WHERE id=${id}`; connection.query(sql, (err, results) => { if (err) throw err; res.send(`修改博客${id}:${title}, ${content}`); }); }); // 删除指定博客 router.delete('/:id', (req, res) => { const id = req.params.id; const sql = `DELETE FROM blog WHERE id=${id}`; connection.query(sql, (err, results) => { if (err) throw err; res.send(`删除博客${id}`); }); }); return router; }; ``` 以上代码实现了一个基本的博客系统,使用了 MySQL 数据库存储博客信息。可以根据实际需求进行修改和完善。需要注意的是,这里的示例代码没有进行参数验证和 SQL 注入防御等安全性方面的处理,实际应用中需要加强安全性方面的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值