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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云解析 DNS,旗舰版 1个月
简介: 【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数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
111 79
|
4月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
127 4
|
3月前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
1282 160
|
1月前
|
消息中间件 存储 NoSQL
java连接redis和基础操作命令
通过以上内容,您可以掌握在Java中连接Redis以及进行基础操作的基本方法,进而在实际项目中灵活应用。
120 30
|
2月前
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
172 36
|
3月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
233 26
|
4月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
4月前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
126 4
|
4月前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
5月前
|
NoSQL 网络协议 算法
Redis 客户端连接
10月更文挑战第21天
71 1

热门文章

最新文章