调用split时触发Cannot read properties of undefined错误求助
问题:Cannot read properties of undefined (reading 'split') 错误排查
我遇到了如下错误:
Cannot read properties of undefined (reading 'split')。控制台报错信息见截图,点击错误链接后,定位到browser.umd.js文件的对应代码行。以下是我的JWT验证中间件代码,请问有人能指出问题所在吗?
const verifyJwt = (req,res,next) => { console.log('entered middle'); let name = 'token='; const header = req.headers['cookie']; const token = header && header.split('=')[1]; if (!token) return res.status(401).send({msg: "Login first please!"}) jwt.verify(token, process.env.TOKEN_KEY, (err, user) => { if(err) return res.status(403).send({msg:"Not authoraized"}) next(); }); } module.exports = verifyJwt
问题分析与解决方案
错误根源
报错提示调用split的对象是undefined,结合你的代码和场景,主要有两个可能:
- 手动解析Cookie的逻辑存在漏洞:直接用
split('=')无法处理多Cookie共存的场景(比如Cookie格式为token=xxx; name=yyy),且虽然用了短路逻辑,但极端场景下仍可能触发未校验的split调用; - 你引入的JWT库版本不对:后端环境应使用Node.js版本的
jsonwebtoken,而非前端版本的browser.umd.js,这可能是报错指向该文件的核心原因。
修复方案
推荐使用cookie-parser中间件来解析Cookie,彻底避免手动解析的问题:
- 先安装依赖:
npm install cookie-parser
- 在主服务文件中引入并启用中间件:
const cookieParser = require('cookie-parser'); const express = require('express'); const app = express(); app.use(cookieParser());
- 修改JWT验证中间件:
const verifyJwt = (req,res,next) => { console.log('entered middle'); // 直接从解析后的cookies对象中获取token const token = req.cookies.token; if (!token) return res.status(401).send({msg: "Login first please!"}) jwt.verify(token, process.env.TOKEN_KEY, (err, user) => { if(err) return res.status(403).send({msg:"Not authorized"}) // 可选:将用户信息挂载到req上,供后续路由使用 req.user = user; next(); }); } module.exports = verifyJwt
如果不想用第三方中间件,也可以手动严谨解析Cookie:
const verifyJwt = (req,res,next) => { console.log('entered middle'); const cookieHeader = req.headers['cookie']; let token = undefined; if (cookieHeader) { // 分割多Cookie并去除首尾空格 const cookies = cookieHeader.split(';').map(item => item.trim()); // 精准匹配token对应的Cookie项 const tokenItem = cookies.find(item => item.startsWith('token=')); if (tokenItem) { token = tokenItem.split('=')[1]; } } if (!token) return res.status(401).send({msg: "Login first please!"}) jwt.verify(token, process.env.TOKEN_KEY, (err, user) => { if(err) return res.status(403).send({msg:"Not authorized"}) next(); }); } module.exports = verifyJwt
额外提示
- 你代码里有拼写错误:
Not authoraized应改为Not authorized; - 确认JWT依赖安装正确:执行
npm install jsonwebtoken,引入时用const jwt = require('jsonwebtoken'),避免使用前端版本的库。
内容的提问来源于stack exchange,提问作者Amit Hadad
相关产品推荐
相关产品推荐

