使用PassportJS做认证时获取Token报错:无法读取headers属性
解决Express-JWT获取Token时的TypeError问题
问题场景
用PassportJS实现认证功能,客户端尝试获取Token时触发错误,相关代码:
import jwt from "express-jwt" const getTokenFromHeaders = (req) => { const {headers : {authorization}} = req if(authorization && authorization.spilt(' ')[0] === 'Token' ){ return authorization.split(' ')[1] } return null }
控制台报错信息
file:///C:/Users/atala/Desktop/atalayapp-main/backend/middleware/auth/auth.js:3 const {headers : {authorization}} = req ^ TypeError: Cannot read properties of undefined (reading 'headers') at getTokenFromHeaders (file:///C:/Users/Desktop/atalayapp-main/backend/middleware/auth/auth.js:3:41) at file:///C:/Users/Desktop/atalayapp-main/backend/middleware/auth/auth.js:15:20 at ModuleJob.run (node:internal/modules/esm/module_job:198:25) at async Promise.all (index 0) at async ESMLoader.import (node:internal/modules/esm/loader:385:24) at async loadESM (node:internal/process/esm_loader:88:5) at async handleMainPromise (node:internal/run_main:61:12)
错误原因
getTokenFromHeaders被调用时未传入有效的req对象,导致req本身为undefined,解构req.headers时触发TypeError。- 代码存在拼写错误:
authorization.spilt(' ')里的spilt应为split,这会导致后续Token提取失败。
修复方案
- 确保函数调用场景正确:
getTokenFromHeaders必须在Express中间件流程内调用,保证传入的是完整的Express请求对象。比如和express-jwt配合时,要正确配置getToken选项。 - 增加防御性判断:先检查
req和req.headers是否存在,避免解构时出错。 - 修正拼写错误:把
spilt改成split。
修复后的完整代码示例:
import jwt from "express-jwt"; const getTokenFromHeaders = (req) => { // 先做防御性检查,避免req或headers不存在的情况 if (!req || !req.headers) return null; const { authorization } = req.headers; if (authorization && authorization.split(' ')[0] === 'Token') { return authorization.split(' ')[1]; } return null; }; // 正确配置express-jwt中间件 const authMiddleware = jwt({ secret: '你的认证密钥', // 替换为实际使用的密钥 algorithms: ['HS256'], // 根据你的加密算法调整 getToken: getTokenFromHeaders }); // 在需要认证的路由中使用该中间件 app.use('/api/protected', authMiddleware, (req, res) => { res.json({ message: '已通过认证', user: req.user }); });
内容的提问来源于stack exchange,提问作者Atalay Özyıldırım
相关产品推荐
相关产品推荐

