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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Node.js实战】一文带你开发博客项目之Express重构(初始化环境,处理 session,连接 redis)

一、前言

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

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

二、初始化环境

1、安装 mysql 和 xxs

终端键入:

npm i mysql
npm i xss

2、迁移文件

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

82c3eead5c7b4e40bac2345e5d7bf647.png

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;

5baff0cf89c44748892ebe7aa9fd7d89.png

三、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.session
    if (session.viewNum == null) {
        session.viewNum = 0
    }
    session.viewNum++
    res.json({
        viewNum: session.viewNum
    })
})

8edfec14ed034db18260ffc733014cc6.png

四、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) {
            // 设置 session
            req.session.username = data.username
            req.session.realname = data.realname
            res.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;

f2dec058d99b427d84bd474358123291.png

e8ca5d1fe2cc4d83a5bf124aa85bccf1.png

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
}))

f29e48bd82164abcb322a6433f303fb4.png

三、写在最后

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


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


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

45fc82a82c6542bdb2ff4986377d8db3.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
相关文章
|
4月前
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
220 4
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
2月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
62 1
|
5月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
6月前
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
JavaScript 前端开发 API
Next.js 实战 (六):如何实现文件本地上传
这篇文章介绍了在Next.js中如何实现文件上传到本地的方法。文章首先提到Next.js官方文档中没有提供文件上传的实例代码,因此开发者需要自行实现,通常有两种思路:使用Node.js原生上传或使用第三方插件如multer。接着,文章选择了使用Node.js原生上传的方式来讲解实现过程,包括如何通过哈希值命名文件、上传到指定目录以及如何分类文件夹。然后,文章展示了具体的实现步骤,包括编写代码来处理文件上传,并给出了代码示例。最后,文章通过一个效果演示说明了如何通过postman模拟上传文件,并展示了上传后的文件夹结构。
206 0
Next.js 实战 (六):如何实现文件本地上传
|
前端开发 API 开发者
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
这篇文章介绍了Framer Motion,一个为React设计的动画库,提供了声明式API处理动画和页面转换,适合创建响应式用户界面。文章包括首屏加载动画、路由加载Loading、路由进场和退场动画等主题,并提供了使用Framer Motion和next.js实现这些动画的示例代码。最后,文章总结了这些效果,并邀请读者探讨更好的实现方案。
262 0
Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
|
11月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
11月前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用
|
10月前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
10月前
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。