Node.js中如何动态指定req.cookies的Cookie名称获取Token
你遇到的核心问题是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
相关产品推荐
相关产品推荐

