You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript结合Express的会话管理入门咨询及教程请求

TypeScript + Express 会话管理实操指南

1. 初始化项目与依赖安装

先创建项目并初始化npm,然后安装核心依赖和TypeScript类型声明:

mkdir ts-express-session && cd ts-express-session
npm init -y
npm install express express-session
npm install -D typescript ts-node @types/express @types/express-session

接着在根目录创建tsconfig.json,配置基础TypeScript编译选项:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "CommonJS",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"]
}

2. 会话初始化配置

在src/index.ts中创建Express实例并配置express-session中间件,这是会话管理的核心步骤:

import express from 'express';
import session from 'express-session';

const app = express();
const PORT = 3000;

// 配置会话中间件
app.use(session({
  secret: 'your-secret-key-here', // 用于签名会话ID的密钥,生产环境要存环境变量
  resave: false, // 强制保存未修改的会话,建议设为false
  saveUninitialized: false, // 强制保存未初始化的会话,建议设为false(符合隐私法规)
  cookie: {
    maxAge: 24 * 60 * 60 * 1000, // 会话有效期1天
    secure: process.env.NODE_ENV === 'production' // 生产环境开启HTTPS时设为true
  }
}));

// 解析JSON请求体
app.use(express.json());

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

3. 扩展TypeScript类型(关键)

默认情况下,TypeScript不知道req.session上的自定义属性,需要扩展类型声明。在项目根目录创建types/express-session.d.ts:

declare module 'express-session' {
  interface SessionData {
    user: {
      id: number;
      username: string;
      // 可添加其他用户字段,比如email、role等
    };
  }
}

export {};

这样在代码中访问req.session.user时就会有类型提示。

4. 在会话中存储用户数据

以登录接口为例,验证用户身份后将用户信息存入会话:

// 模拟用户数据库
const users = [
  { id: 1, username: 'alice', password: '123456' }
];

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  const user = users.find(u => u.username === username && u.password === password);

  if (!user) {
    return res.status(401).json({ message: '用户名或密码错误' });
  }

  // 将用户信息存入会话(注意不要存敏感信息,比如密码)
  req.session.user = { id: user.id, username: user.username };
  res.json({ message: '登录成功', user: req.session.user });
});

5. 获取与使用会话数据

创建接口获取当前登录用户信息,或通过中间件验证用户是否登录:

// 验证登录状态的中间件
const requireAuth = (req: express.Request, res: express.Response, next: express.NextFunction) => {
  if (!req.session.user) {
    return res.status(401).json({ message: '请先登录' });
  }
  next();
};

// 获取当前用户信息
app.get('/profile', requireAuth, (req, res) => {
  res.json({ user: req.session.user });
});

6. 销毁会话(登出)

创建登出接口,清除会话数据:

app.post('/logout', (req, res) => {
  req.session.destroy(err => {
    if (err) {
      return res.status(500).json({ message: '登出失败' });
    }
    res.clearCookie('connect.sid'); // 清除会话Cookie
    res.json({ message: '登出成功' });
  });
});

注意事项

  • 生产环境不要使用默认的内存存储(会导致内存泄漏,重启服务器丢失会话),可以使用connect-redis等第三方存储(需安装对应类型声明)。
  • secret要使用安全的随机字符串,生产环境通过环境变量注入,不要硬编码。
  • 敏感数据不要存入会话,比如用户密码,只存必要的标识信息。

内容的提问来源于stack exchange,提问作者dmx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:55:24