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

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

在这里插入图片描述

首先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
    在这里插入图片描述
  • 加上就成功了!
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我简单介绍一下如何使用 Node.js 和 MongoDB 开发一个简单的项目。 首先,你需要安装 Node.js 和 MongoDB。Node.js 官网提供了安装包和详细的安装说明,MongoDB 的官网也提供了相应的安装包和文档。 接下来,我们可以开始创建项目了。在命令行中,进入你想要创建项目的目录,输入以下命令: ``` mkdir myproject cd myproject npm init ``` 这些命令将创建一个名为 myproject 的文件夹,并在其中创建一个 package.json 文件。这个文件是用来管理你的项目依赖和配置的。 接下来,我们需要安装一些必要的依赖,包括 express、mongoose 和 body-parser。在命令行中输入以下命令: ``` npm install express mongoose body-parser --save ``` 这些命令将安装这些依赖,并将它们添加到 package.json 文件中的 dependencies 中。 接下来,我们需要创建一个 server.js 文件。在该文件中,我们将设置服务器和数据库连接,并定义一些路由和 API。 以下是一个简单的 server.js 文件示例: ``` const express = require('express'); const bodyParser = require('body-parser'); const mongoose = require('mongoose'); const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); mongoose.connect('mongodb://localhost/myproject', { useNewUrlParser: true, useUnifiedTopology: true }); const db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function() { console.log('Connected to MongoDB'); }); const router = express.Router(); router.get('/', function(req, res) { res.json({ message: 'Welcome to my API' }); }); app.use('/api', router); app.listen(3000, function() { console.log('Server started on port 3000'); }); ``` 在这个示例中,我们首先引入了 express、body-parser 和 mongoose 模块。然后,我们创建了一个 express 实例,并使用 body-parser 中间件来解析请求体。 接下来,我们使用 mongoose.connect() 方法连接到 MongoDB 数据库。在这里,我们连接到名为 myproject 的数据库,使用了一些选项来避免控制台输出警告信息。 在连接成功后,我们创建了一个 express.Router() 实例,并定义了一个简单的 GET 路由,返回一个 JSON 响应。 最后,我们将路由挂载到 /api 前缀下,并启动服务器,监听 3000 端口。 这只是一个简单的示例,你可以根据自己的需要进一步扩展和完善这个项目

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值