Node.js中如何在不同路由之间传递Token?
在Node.js路由间传递Token的可行方案
针对你要在/search路由获取Token后传递到/fare路由的需求,以下是几种实用的实现方式:
1. 使用Express会话(express-session)
适合在用户同一会话内共享数据,需先安装依赖:
npm install express-session
配置并实现:
const express = require('express'); const session = require('express-session'); const app = express(); // 会话配置 app.use(session({ secret: 'your-custom-secret-key', // 替换为实际安全密钥 resave: false, saveUninitialized: true, cookie: { secure: false } // 生产环境建议开启HTTPS并设为true })); // /search路由:存储Token到会话 app.post('/search', async (req, res) => { const tokenId = response.data.TokenId; req.session.tokenId = tokenId; res.send({ success: true, msg: 'Token已存储' }); }); // /fare路由:从会话读取Token app.post('/fare', (req, res) => { const tokenId = req.session.tokenId; if (!tokenId) { return res.status(400).send({ error: '未找到Token,请先调用/search接口' }); } // 后续使用Token的业务逻辑 console.log('当前使用的Token:', tokenId); res.send({ success: true, usedToken: tokenId }); });
2. 通过Cookie存储Token
将Token写入客户端Cookie,请求/fare时自动携带,服务器读取:
const cookieParser = require('cookie-parser'); app.use(cookieParser()); // 需要先安装cookie-parser:npm install cookie-parser // /search路由:设置Cookie存储Token app.post('/search', async (req, res) => { const tokenId = response.data.TokenId; res.cookie('searchToken', tokenId, { httpOnly: true, // 禁止前端JS读取,提升安全性 maxAge: 3600000 // 1小时后过期 }); res.send({ success: true }); }); // /fare路由:从Cookie读取Token app.post('/fare', (req, res) => { const tokenId = req.cookies.searchToken; if (!tokenId) { return res.status(400).send({ error: '未找到有效Token' }); } // 使用Token执行业务逻辑 res.send({ success: true, token: tokenId }); });
3. 让客户端存储并主动传递Token
由客户端保存Token,请求/fare时手动携带,无需服务器端存储:
客户端示例(前端JS):
// 调用/search后保存Token fetch('/search', { method: 'POST', body: JSON.stringify(yourRequestData), headers: { 'Content-Type': 'application/json' } }) .then(res => res.json()) .then(data => { localStorage.setItem('searchToken', data.tokenId); }); // 调用/fare时携带Token fetch('/fare', { method: 'POST', headers: { 'Authorization': `Bearer ${localStorage.getItem('searchToken')}`, 'Content-Type': 'application/json' }, body: JSON.stringify(fareRequestData) });
服务器端路由:
// /search路由:返回Token给客户端 app.post('/search', async (req, res) => { const tokenId = response.data.TokenId; res.send({ success: true, tokenId }); }); // /fare路由:从请求头读取Token app.post('/fare', (req, res) => { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).send({ error: '缺少有效Token' }); } const tokenId = authHeader.split(' ')[1]; // 使用Token执行业务逻辑 res.send({ success: true, usedToken: tokenId }); });
4. 服务器端全局存储(无会话场景)
适合不需要关联用户的场景,可使用内存或Redis存储:
内存存储(仅单进程开发环境):
// 全局变量存储Token(注意:多进程/服务重启会丢失数据) let globalSearchToken = null; app.post('/search', async (req, res) => { globalSearchToken = response.data.TokenId; res.send({ success: true }); }); app.post('/fare', (req, res) => { if (!globalSearchToken) { return res.status(400).send({ error: 'Token未初始化' }); } // 使用Token执行业务逻辑 res.send({ success: true, token: globalSearchToken }); });
Redis存储(生产环境多进程适用):
需先安装依赖:npm install redis
const redis = require('redis'); const redisClient = redis.createClient(); redisClient.connect(); app.post('/search', async (req, res) => { const tokenId = response.data.TokenId; // 存入Redis并设置1小时过期 await redisClient.setEx('search_token', 3600, tokenId); res.send({ success: true }); }); app.post('/fare', async (req, res) => { const tokenId = await redisClient.get('search_token'); if (!tokenId) { return res.status(400).send({ error: 'Token已过期或未生成' }); } // 使用Token执行业务逻辑 res.send({ success: true, token: tokenId }); });
内容的提问来源于stack exchange,提问作者jibzy
相关产品推荐
相关产品推荐

