【Node.js实战】一文带你开发博客项目之Express重构(初始化环境,处理 session,连接 redis)

news/2025/1/15 18:12:31/

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端
📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招)
🚀未来打算: 为中国的工业软件事业效力n年
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2&Vue3项目实战 🥝Node.js🍒Three.js
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

Node.js系列文章目录

内容参考链接
Node.js(一)初识 Node.js
Node.js(二)Node.js——开发博客项目之接口
Node.js(三)Node.js——一文带你开发博客项目(使用假数据处理)
Node.js(四)Node.js——开发博客项目之MySQL基础
Node.js(五)Node.js——开发博客项目之API对接MySQL
Node.js(六)Node.js——开发博客项目之登录(前置知识)
Node.js(七)Node.js——开发博客项目之登录(对接完毕)
Node.js(八)Node.js——开发开发博客项目之联调
Node.js(九)Node.js——开发博客项目之日志
Node.js(十)Node.js——开发博客项目之安全
Node.js(十 一)Node.js——开发博客项目之初识 Express

文章目录

  • Node.js系列文章目录
    • 一、前言
    • 二、初始化环境
      • 1、安装 mysql 和 xxs
      • 2、迁移文件
      • 3、修改 blog.js 文件
    • 三、Express 处理 session
      • 1、安装 express-session
      • 2、测试 session
    • 四、session 连接 redis
      • 1、登录测试
      • 2、使用 connect-redis 插件
      • 3、session 连接 redis
    • 三、写在最后


一、前言

前面我们学习了如何安装 Express,并初步理解了什么是中间件机制。

接下来,我们再回到我们的 myblog 博客项目中,去重构和完善我们的功能…

二、初始化环境

1、安装 mysql 和 xxs

终端键入:

npm i mysql
npm i xss

2、迁移文件

我们原生node.js的工作并没有白做。接下来,我们把之前写的代码初步迁移到 Express 版本的 myblog 博客项目中

在这里插入图片描述

3、修改 blog.js 文件

我们首先在查询上(/list)做点东西(呈现出 list 的内容)…

blog.js

var express = require('express');
var router = express.Router();
// 导入博客和用户控制器相关内容
const {getList,getDetail,newBlog,updateBlog,delBlog
} = require('../controller/blog')
// 导入成功和失败的模型
const {SuccessModel,ErrorModel
} = require('../model/resModel')// 博客列表
router.get('/list', function (req, res, next) {// 博客的作者,req.query 用在 GET 请求中let author = req.query.author || ''// 博客的关键字const keyword = req.query.keyword || ''// 查询的结果const result = getList(author, keyword)return result.then(listData => {res.json(new SuccessModel(listData))})
});// 博客详情
router.get('/detail', function (req, res, next) {res.json({errno: 0,data: 'OK'})
});module.exports = router;

在这里插入图片描述


三、Express 处理 session

1、安装 express-session

  • 使用 express-session 和 connect-redis,简单方便
  • req.session 保存登录信息,登录校验做成 express 中间件

我们在控制台安装 express-session

npm i express-session

2、测试 session

之后在 app.js 中导入和使用 session

app.js

const session = require('express-session')
....
app.use(cookieParser());// 解析完 cookie,我们解析 session
app.use(session({secret: 'QianDuan2023', // 密匙cookie: {// path: '/', // 根目录(默认配置)// httpOnly: true, // 只能后端操作 cookie(默认配置)maxAge: 24 * 60 * 60 * 1000 // 小时,分钟,秒,毫秒}
}))

之后,在 user.js 中测试一下当前用户的状态存储(每次刷新记录一次)

user.js

router.get('/session-test', (req, res, next) => {const session = req.sessionif (session.viewNum == null) {session.viewNum = 0}session.viewNum++res.json({viewNum: session.viewNum})
})

在这里插入图片描述


四、session 连接 redis

1、登录测试

我们使用 /login-test 进行登录测试

user.js

验证登录的逻辑

var express = require('express');
var router = express.Router();
const {login
} = require('../controller/user')
const {SuccessModel,ErrorModel
} = require('../model/resModel')router.post('/login', function (req, res, next) {// post 接口都是从 req.body 中获取const {username,password} = req.body// 传入两个参数 用户名 密码const result = login(username, password)return result.then(data => {if (data.username) {// 设置 sessionreq.session.username = data.usernamereq.session.realname = data.realnameres.json(new SuccessModel())return}res.json(ErrorModel('登录失败'))})
});router.get('/login-test', (req, res) => {if (req.session.username) {res.json({errno: 0,msg: '已登录'})return}res.json({errno: -1,msg: '未登录'})
})module.exports = router;

在这里插入图片描述

在这里插入图片描述

2、使用 connect-redis 插件

终端键入安装

npm i redis connect-redis

在 db 文件夹下创建 redis.js 文件,定义连接对象

redis.js

const redis = require('redis')
const {REDIS_CONF
} = require('../conf/db.js')// 创建客户端
const redisClient = redis.createClient({url: `redis://${REDIS_CONF.host}:${REDIS_CONF.port}`,legacyMode: true
})// 连接
redisClient.connect().then(() => console.log('redis connect sucess!')).catch(console.error)module.exports = redisClient

3、session 连接 redis

接下来,我们修改 app.js 文件,完成 session 和 redis 的连接

app.js

const RedisStore = require('connect-redis')(session)
......// 获取到 redisClient
const redisClient = require('./db/redis')
const sessionStore = new RedisStore({client: redisClient
})
// 解析完 cookie,我们解析 session
app.use(session({secret: 'QianDuan2023', // 密匙cookie: {// path: '/', // 根目录(默认配置)// httpOnly: true, // 只能后端操作 cookie(默认配置)maxAge: 24 * 60 * 60 * 1000 // 小时,分钟,秒,毫秒},// 把 session 存储到 redis 里store: sessionStore,resave: false,saveUninitialized: false
}))

在这里插入图片描述


三、写在最后

至此,我们明白了 如何使用 Express 框架对我们的 myblog 项目进行初步的重构, 继续跟进学习吧!

后续会对该项目进行多次重构【多种框架(express,koa)和数据库(mysql,sequelize,mongodb)】

如果你需要该项目的 源码,请通过本篇文章最下面的方式 加入 进来~~


在这里插入图片描述



http://www.ppmy.cn/news/20482.html

相关文章

网络编程 -- socket 套接字

文章目录socket 套接字UDP 和 TCP 区别1. 有连接 VS 无连接2. 可靠传输 VS 不可靠传输3. 面向字节流 VS 面向数据报4. 全双工UDP 数据报套接字编程TCP 数据报套接字编程socket 套接字 本文就来学习一下 网络编程, 既然谈到了网络编程,那么要如何进行呢 &…

软件设计(二)

软件设计(一)https://blog.csdn.net/ke1ying/article/details/128779601 11、windows系统当双击.jpg文件的时候,系统会通过建立的 文件关联 来决定使用什么程序来打开该图像文件。 (双击.jpg文件,系统会建立‘window…

【FreeRTOS】详细讲解FreeRTOS的软件定时器及通过示例讲述其用法

软件定时器 所谓定时器,也就可以类比生活中人们常用的闹钟,可以单次响铃提醒,也可以间隔固定时间响铃提醒;与FreeRTOS定时器不同的是周期不同,FreeRTOS的周期更加短,一般使用毫秒(ms)、秒(s)。   软件定时…

【SpringCloud】Gateway服务网关的基本使用

一、初识Gateway服务网关为什么需要网关?在微服务中,各个模块之间的调用,也可以称其为远程调用!但是,如果是外部(用户)对微服务进行访问时,发的请求能不加处理的直接访问微服务吗&am…

【全套完结】通信原理----全套Matlab仿真实验报告

💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ &#x…

2Pai半导体-推出π122E61双通道数字隔离器 智能分压技术 兼容代替Si8622ET-IS

2Pai半导体-推出π122E61双通道数字隔离器 智能分压技术 兼容代替Si8622ET-IS 电路简单、稳定性更高 ,具有出色的性能特征和可靠性,整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立,可实现多种传输方向的配置&…

微信小程序页面跳转三种方式

为了不让用户在使用小程序时造成困扰,微信小程序规定页面路径只能是五层,请尽量避免多层级的交互方式。 页面跳转的话就涉及到了多个页面层级 第一种:wx.navigateTo(OBJECT) 保留当前页面,跳转到应用内的某个页面,使用…

c++实现堆排序

看了一下优先队列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交换2个操作。如果建的是最大堆,那么交换的时候,父节点就和最大的子节点比较,如果它比最大的子节点还大,那就不用比了。因为…