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

Node.js中如何动态指定req.cookies的Cookie名称获取Token

解决JWT认证中间件动态Cookie名称问题

你遇到的核心问题是JavaScript对象属性访问的语法差异:用.访问属性时,后面的名称会被当作字面量字符串,而不是变量的值。所以req.cookies.cookieName会去查找名为"cookieName"的cookie,而不是你传入的参数值对应的cookie。

修改方案

直接把点语法改成方括号语法,同时修正代码里的笔误:

const jwt = require('jsonwebtoken');
const Admin = require('../models/admin');
const auth = (cookieName) => {
  return async (req, res, next) => {
    console.log(cookieName); // 修正原代码的ckname为cookieName
    try {
      // 用方括号语法动态获取对应名称的cookie
      const token = req.cookies[cookieName];

      if (!token) { // 新增:处理cookie不存在的情况
        throw new Error('Token not found in cookies');
      }

      const verifyToken = jwt.verify(token, process.env.SECRET_KEY);
      const rootUser = await Admin.findOne({ _id: verifyToken.id });

      if (!rootUser) {
        throw new Error('User Not Found');
      }

      req.rootUser = rootUser;
      next();
    } catch (error) {
      res.status(401).send(`Unauthorized User: ${error.message}`);
      console.log(error);
    }
  };
};

module.exports = auth;

使用示例

在路由中调用中间件时,直接传入你需要的cookie名称即可:

// 管理员路由用JwtAdm cookie
router.get('/admin/dashboard', auth('JwtAdm'), (req, res) => {
  // 处理逻辑
});

// 普通用户路由用JwtUser cookie
router.get('/user/profile', auth('JwtUser'), (req, res) => {
  // 处理逻辑
});

额外说明

  • 确保传入的cookieName和前端设置的cookie名称完全一致,大小写敏感;
  • 新增的!token判断可以提前拦截未携带对应cookie的请求,避免进入jwt.verify的报错流程;
  • 错误信息里加入具体的错误原因,方便调试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:31:06