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

Express后端与Deno Fresh前端:Token Cookie仅部分请求可读取问题

问题排查与解决办法

1. 先修复Token读取的代码错误

你日志中间件里的这段代码存在明显问题:

token = request.get("X-Access-Token") ?? "request.cookies.token" ?? ""

这里的"request.cookies.token"是一个字符串常量,并不是读取Cookie变量的代码!不管实际Cookie是否存在,代码都会把这个字符串当作token,自然读不到真实的Cookie值。正确写法要去掉引号:

token = request.get("X-Access-Token") ?? request.cookies.token ?? ""

这大概率是/api接口无法读取token的直接原因,优先修复这个问题。

2. 调整Fetch请求的凭证配置

如果前端(Deno Fresh)和后端(Express)属于跨域场景(比如前端域名是app.mydomain.com,后端是api.mydomain.com),仅设置credentials: "same-origin"是无效的,必须使用credentials: "include"才能让跨域请求携带Cookie。

在Fresh中发起/api请求时,统一添加该配置:

// 示例:在Fresh的handler或封装的fetch函数中
const res = await fetch("https://api.mydomain.com/api/xxx", {
  method: "GET", // 按需替换请求方法
  credentials: "include" // 替换原来的same-origin
});

3. 后端Express的CORS配置必须匹配

跨域请求携带Cookie时,Express的CORS配置要满足两个核心要求:

  • origin不能设置为*,必须指定前端的实际域名(比如https://app.mydomain.com)
  • 开启credentials: true

参考配置示例:

const cors = require('cors');
app.use(cors({
  origin: "https://app.mydomain.com", // 替换为你的前端域名
  credentials: true,
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'X-Access-Token']
}));

4. 验证Cookie的设置参数

确认后端设置Cookie时的参数是否正确:

  • domain: ".mydomain.com":确保前端域名是该主域名下的子域名(如app.mydomain.com),否则Cookie不会被携带
  • path: "/":如果未设置path,默认是当前请求路径(比如/api/login),这会导致只有/api路径下的请求能访问Cookie,建议显式设置为/以覆盖所有路径:
res.cookie('token', '你的token值', {
  domain: '.mydomain.com',
  path: '/',
  maxAge: 24 * 60 * 60 * 1000,
  // 按需添加httpOnly、secure等参数
});

5. 测试验证步骤

修复后按以下步骤验证:

  • 登录后打开浏览器Application面板,确认Cookie的domain、path参数正确
  • 前端发起/api请求,查看Network面板的请求头是否包含Cookie字段
  • 检查后端日志,确认token已被正确读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:43:21