Node.js Express中解构对象报错但console.log正常的问题求助
Express中间件解构对象报错问题
在Express中间件中尝试解构对象时遇到错误,代码如下:
const checkIfLoggedIn = (req, res, next) => { try { const { token } = req.cookies['jwt-auth']; console.log('token: ', token); req.token = jwt.verify(token, SECRET); next(); } catch (err) { console.error(err); res .status(401) .json({ ok: false, message: 'ERROR: you need to be logged in' }); } }
应用输出错误信息:
TypeError: Cannot destructure property 'token' of 'req.cookies.jwt-auth' as it is undefined. at checkIfLoggedIn (/home/bader/Projects/be_productive/services/authorization.middleware.js:8:17) at Layer.handle [as handle_request] (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:328:13) at /home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:286:9 at Function.process_params (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:346:12) at next (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:280:10) at cookieParser (/home/bader/Projects/be_productive/node_modules/.pnpm/cookie-parser@1.4.6/node_modules/cookie-parser/index.js:57:14) at Layer.handle [as handle_request] (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:328:13) at /home/bader/Projects/be_productive/node_modules/.pnpm/express@4.18.2/node_modules/express/lib/router/index.js:286:9 token: (Token from front-end (I change this line))
明明console.log能正常打印正确的token,尝试用点语法替代解构写法,问题依然存在。
问题原因及解决方案
错误核心是**req.cookies['jwt-auth']为undefined时,你尝试解构它的token属性**。你看到的console.log是来自成功携带jwt-auth cookie的请求,而报错是来自另一个未携带该cookie的请求,两者并非同一个请求的输出,所以会出现“报错但log有值”的矛盾现象。
修复代码
在解构前先检查jwt-auth cookie是否存在:
const checkIfLoggedIn = (req, res, next) => { try { // 先确认auth cookie存在 const authCookie = req.cookies['jwt-auth']; if (!authCookie) { throw new Error('未携带认证Cookie'); } const { token } = authCookie; console.log('token: ', token); req.token = jwt.verify(token, SECRET); next(); } catch (err) { console.error(err); res .status(401) .json({ ok: false, message: 'ERROR: you need to be logged in' }); } }
额外排查点
- 确认
cookie-parser中间件挂载顺序是否在这个路由中间件之前(从错误栈看已挂载,但可再检查全局路由配置)。 - 排查是否存在未登录请求、跨域请求未配置凭证(
withCredentials: true)等场景,导致请求未携带jwt-authcookie。
内容的提问来源于stack exchange,提问作者Bader
相关产品推荐
相关产品推荐

