Express.js中间件JWT Token过期处理异常求助
解决前端无法处理JWT过期401响应的问题
一、修复前端代码语法错误
你的fetch请求代码存在语法闭合问题,导致逻辑无法正常执行,同时可以优化响应判断逻辑:
const checkToken = async () => { try { const response = await fetch('http://localhost:3000/admin/register', { method: 'GET', credentials: 'include' }); // 统一处理所有非2xx状态码的响应 if (!response.ok) { const data = await response.json(); if (data.code === 'TOKEN_EXPIRED') { window.location.href = data.redirectTo; } else { console.error('Error:', data.message || 'Unknown error'); } throw new Error(data.message || 'Request failed'); } // 请求成功后的业务逻辑 const result = await response.json(); console.log('Request succeeded:', result); } catch (error) { // 捕获网络错误或JSON解析失败的情况 console.error('Fetch error:', error); } };
二、检查服务器端CORS配置
如果前端与服务器跨域,必须正确配置CORS才能让浏览器正常接收响应,否则会被拦截:
const cors = require('cors'); app.use(cors({ origin: 'http://前端域名:端口', // 例如'http://localhost:8080',不能设为* credentials: true, // 允许携带Cookie allowedHeaders: ['Content-Type'] }));
三、验证服务器端中间件逻辑
确保中间件在返回错误响应后终止请求流程,避免后续代码干扰:
const jwt = require('jsonwebtoken'); const authMiddleware = (req, res, next) => { const token = req.cookies.jwtToken; // 替换为你的Cookie名称 if (!token) { return res.status(401).json({ message: 'No token provided', code: 'NO_TOKEN' }); } jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => { if (err) { if (err.name === 'TokenExpiredError') { console.error('JWT expired:', err); return res.status(401).json({ message: 'JWT expired', code: 'TOKEN_EXPIRED', redirectTo: '/login' }); } console.error('JWT verification failed:', err); return res.status(401).json({ message: 'JWT verification failed', code: 'TOKEN_INVALID' }); } req.user = decoded; next(); }); };
四、调试步骤
- 打开浏览器开发者工具的网络面板,查看请求的响应状态和响应体,确认服务器是否返回了预期的JSON。
- 在前端
!response.ok分支中添加console.log(data),打印返回的完整数据,确认code字段是否正确。 - 检查控制台是否有跨域错误提示,优先解决CORS配置问题。
内容的提问来源于stack exchange,提问作者Daadirs Jr
相关产品推荐
相关产品推荐

