【Node.js】项目开发实战(下)

开发用户的基本信息接口

      • 获取用户信息 最终文件列表展示
      • 首先db/index.js下连接数据库mysql2
      • 增删改查用户的信息代码展示(文件之间内容穿插)
      • 1,注册并登录,拿到用户的token进行增删改查
      • 2,配置定义joi表单规则,schema/user.js
      • 3,初始化路由模块,router/userinfo.js
      • 4,初始化路由处理函数模块,router_handler/userinfo.js
      • 5,app.js的启动服务器及导入(建议从项目实战(上)看起,否则看不懂哦!)
        • 跑一下!

获取用户信息 最终文件列表展示

【Node.js】项目开发实战(下)_第1张图片

首先db/index.js下连接数据库mysql2

// 1.导入mysql2模块
const mysql = require('mysql2')
// 2,建立与MySQL数据库的连接
const db = mysql.createPool({
    host: "127.0.0.1", //数据库的IP地址
    user: "root", //登录数据库的账号
    password: "xxxxxx", //登录数据库的密码
    database: "my_db_01", //指定要操作哪个数据库
})
//3.检测mysql模块是否正常工作 SELECT 1 无作用,只是测试
db.query('SELECT 1',(err, results) => {
    //err为报错信息
    if (err) return console.log(err)
    //res是成功的消息
    console.log(results) 
}) 
module.exports = db

增删改查用户的信息代码展示(文件之间内容穿插)

1,注册并登录,拿到用户的token进行增删改查

2,配置定义joi表单规则,schema/user.js

// 导入joi,定义表单规则
const joi = require("joi")
// 导入express-joi中间件,表单验证模块
const expressJoi = require("@escook/express-joi")

const userSchema = {
    // 校验req.body的数据
    body: {
        id: joi.number().integer().min(1).required(),//测试的时候根据接口需要展示和隐藏+
        // 字符串,还必须字符和数字的组合,最小三位,最大12位,必传
        username: joi.string().alphanum().min(3).max(12).required(),
        // pattern指定正则表达式
        password: joi.string().pattern(/^[\S]{6,15}$/),
        //当前规则和paddword规则保持一致,但新旧密码不能一致,如果加concat用于合并 joi.not(joi.ref('password'))和password这两条验证规则
        repassword: joi.not(joi.ref('password')),
        // 邮箱规则
        email: joi.string().email().required()
    },
    // 校验req.query的数据
    query: {},
    // 校验req.params的数据
    params: {}
}
// 暴露所有注册的表单验证规则
exports.userSchema = userSchema

// 或者,假设你要验证的是id,但你定义的是id1,就可以通过下面这个来
// const id1= joi.number().integer().min(1).required()
// exports.userSchema = {
//     body: {
//        id:id1,
//     }
// }

3,初始化路由模块,router/userinfo.js

// 用户基本信息模块
// 导入express
const express = require('express')

// 创建路由对象
const router = express.Router()

// 导入用户处理函数模块
const userhandler = require('../router_handler/userinfo')

// 1.导入验证表单数据的中间件
const expressJoi = require("@escook/express-joi")

// 2.导入需要验证的验证规则对象
const {userSchema} = require('../schema/user')

// 获取用户信息
router.post('/getuserinfo',expressJoi(userSchema), userhandler.getuserinfo)

// 修改用户信息
router.post('/setuserinfo',expressJoi(userSchema), userhandler.setuserinfo)

// 重置用户密码
router.post('/updatepassword',expressJoi(userSchema), userhandler.updatepassword)

module.exports = router

4,初始化路由处理函数模块,router_handler/userinfo.js

// 导入数据库操作模块
const db = require("../db/index")
//密码
const bcrypt = require("bcryptjs")
// 获取用户信息接口
exports.getuserinfo = (req, res) => {
    const sql = "select id,username,nickname,email,user_pic from ev_users where id=?"
    db.query(sql, req.user.id, (err, results) => {
        // 1.执行sql语句失败
        if (err) return res.cc(err)

        // 2.执行sql语句成功,但是查询到的数据条数不等于1
        if (results.length !== 1) return res.cc("获取用户信息失败")

        // 3,将用户信息响应给客户端 
        res.send({
            staus: 1,
            message: "获取用户信息成功",
            data: results[0]
        })
    })
}
// 修改用户信息接口
exports.setuserinfo = (req, res) => {
    const sql = "update ev_users set ? where id=?"
    db.query(sql, [req.body, req.user.id], (err, results) => {
        // 1.执行sql语句失败
        if (err) return res.cc(err)

        // 2.执行sql语句成功,但是查询到的数据条数不等于1
        if (results.affectedRows !== 1) return res.cc("修改用户信息失败")

        // 3,将用户信息响应给客户端 
        res.send({
            staus: 1,
            message: "修改用户信息成功",
            data: results[0]
        })
    })
}

// 重置用户密码接口
exports.updatepassword = (req, res) => {
    // 根据id查询用户信息
    const sql = "select * from ev_users where id=?"
    console.log(req.user)
    db.query(sql, req.user.id, (err, results) => {
        // 1.执行sql语句失败
        if (err) return res.cc(err)

        // 2.执行sql语句成功,但是查询到的数据条数不等于1
        if (results.length !== 1) return res.cc("用户不存在")

        // 3,验证密码是否正确,拿客户端输入的密码和服务器的,密码比较
        const Result = bcrypt.compareSync(req.body.password, results[0].password)
        if (!Result) return res.cc("旧密码错误")

        // 4,对新密码进行加密,更新服务器的密码 
        const newPwd = bcrypt.hashSync(req.body.repassword, 10)
        const upsql = "update ev_users set password=? where id=?"
        db.query(upsql, [newPwd, req.body.id], (err1, results1) => {
            // 1.执行sql语句失败
            if (err1) return res.cc(err1)
            //2,res.affectedRows是影响的行数
            if (results1.affectedRows !== 1) {
                res.cc('密码重置失败')
            }
            res.cc('密码重置成功',1)
        })
    })
}

5,app.js的启动服务器及导入(建议从项目实战(上)看起,否则看不懂哦!)

// 导入express
const express = require('express')
// 创建express的服务器实例
const app = express()
// 启动服务器
app.listen(3007, () => {
    console.log("服务器启动:http://127.0.0.1:3007")
})

// 配置cors跨域中间件
const cors = require("cors")
// 将cors注册为全局中间件
app.use(cors())

// 配置解析表单数据的中间件,这个中间件只能解析application/x-www-form-urlencoded 格式的表单数据
app.use(express.urlencoded({
    extended: false
}))

//响应数据的中间件,上游挂载,下游共享
app.use((req, res, next) => {
    // status=0是失败,status=1是成功,默认为0
    res.cc = (err, status = 0) => {
        res.send({
            status,
            // 判断err是错误对象还是字符串
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})

// 导入配置文件
const config = require('./config')
// 导入解析token的中间件
const expressJWT = require('express-jwt')
// 使用.unless可以指定哪些接口不需要toke身份验证
app.use(expressJWT({
    secret: config.jwtSecretKey
}).unless({
    path: [/^\/api\//]
}))

// 导入并使用用户路由模块
const userRouter = require("./router/user")
// 导入用户信息模块
const userinfoRouter = require("./router/userinfo")
// 注册
app.use('/api', userRouter)
// 用户信息模块
app.use('/my', userinfoRouter)

//全局错误中间件
const joi = require('joi')
app.use((err, req, res, next) => {
    // 捕获表单验证失败的报错
    if (err instanceof joi.ValidationError) return res.cc(err)
    // 捕获token解析失败的错误
    if (err.name === 'UnauthorizedError') return res.cc('身份验证失败')
    res.cc(err)
    next()
})

跑一下!

  • 由于上一篇的捕获token解析, path: [/^/api//],且没限制/my开头的,所以导致这回请求接口不传token会失败
  • 切记传token
  • 如果安装了nodemon,终端运行,nodemon .\app.js
    【Node.js】项目开发实战(下)_第2张图片
  • 加上就成功了!
    【Node.js】项目开发实战(下)_第3张图片
    【Node.js】项目开发实战(下)_第4张图片

你可能感兴趣的:(Node.js,node.js,数据库,javascript)