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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:29