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
相关产品推荐
相关产品推荐

