如何在 Express.js 中设置和使用 Session

Session 是 Web 应用程序中管理用户状态的一种方法。在 Express.js 中,使用 Session 可以方便地存储用户的登录状态、购物车、喜好设置等信息,以便于用户在多次请求之间访问这些数据。在本篇文章中,我们将学习如何在 Express.js 中设置和使用 Session。

安装和配置 session 中间件

在使用 Session 之前,需要先安装和配置相应的中间件。我们可以使用以下命令安装 express-session 中间件:

npm install express-session --save

然后在 Express.js 的主文件中引入和配置 express-session 中间件:

const express = require('express');
const session = require('express-session');

const app = express();

app.use(session({
  secret: 'your-secret-key',
  resave: false,
  saveUninitialized: true
}));

上面的代码中,secret 属性是一个用于生成 Session ID 的密码,可以任意设置。resavesaveUninitialized 属性是两个 Boolean 值,分别表示在每个请求响应完毕后是否强制保存 Session 和初始化 Session 对象。通常将它们都设置为 false

在路由中设置和获取 Session

在 Express.js 中存储和访问 Session 很简单。在路由中添加以下代码:

app.get('/login', (req, res) => {
  req.session.username = 'user123';
  res.send('Login success!');
});

app.get('/profile', (req, res) => {
  const username = req.session.username;
  if (username) {
    res.send(`Welcome back, ${username}`);
  } else {
    res.send('Please login first');
  }
});

上面的代码中,/login 路由将用户名存储在 Session 中,/profile 路由从 Session 中读取用户名并作为欢迎信息返回给用户。如果 Session 中不存在用户名,则提示用户先登录。

Session 的默认存储方式

默认情况下,Express.js 中的 Session 是内存存储的。这意味着当您关闭 Node.js 服务器时,所有 Session 对象都将丢失。因此,在生产环境下,我们需要将 Session 存储到数据库或其他第三方存储服务中。

使用 Redis 存储 Session

Redis 是一种流行的内存数据库,可用于存储 Session 数据。我们可以使用 connect-redis 模块将 Session 存储到 Redis 中。以下是引入和配置 Redis Session 存储的示例代码:

const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);

const app = express();
const redisClient = // 初始化 redisClient

app.use(session({
  secret: 'your-secret-key',
  resave: false,
  saveUninitialized: true,
  store: new RedisStore({ client: redisClient })
}));

上面代码中,我们引入 connect-redis 模块并使用 RedisStore 构造函数来创建 Redis 存储实例。然后将其传递给 session 中间件的 store 属性,以代替默认的内存存储。

总结

Session 是 Web 应用程序中管理用户状态的一个重要抽象。在 Express.js 中使用 Session 很简单,只需要安装和配置相应的中间件,然后在路由中进行设置和获取。在生产环境中,我们需要使用第三方存储服务(比如 Redis)来存储 Session 数据,以免丢失。希望这篇文章对您在使用 Express.js 中的 Session 产生了帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b6fdd5add4f0e0fff9a7ec