JWT授权登录失败可正常拉取用户信息 问题排查求助
问题根因
你提供的登录逻辑中存在未定义变量引用错误,这是触发报错的直接原因。
问题出在登录函数的jwt生成逻辑段:
try{ token = jwt.sign({userId: existingUser.id, email: existingUser.email}, process.env.JWT_KEY, {expiresIn: '1h'}); user.token = token; }catch(err){ const error = new HttpError( 'Logging in failed, please try again', 500 ); return next(error); }
在整个login方法的作用域内,你仅定义了存储数据库查询结果的existingUser变量,从未声明过名为user的变量,执行user.token = token时会直接抛出未定义变量的引用错误,被catch块捕获后就返回了你看到的报错信息。
修复方案
两种可选修复方式,按需选择即可:
- 如果你不需要将token存储到用户实例上(你后续返回给前端的响应直接使用了生成的
token变量,并未用到user.token),直接删除user.token = token;这一行即可:
try{ token = jwt.sign({userId: existingUser.id, email: existingUser.email}, process.env.JWT_KEY, {expiresIn: '1h'}); }catch(err){ const error = new HttpError( 'Logging in failed, please try again', 500 ); return next(error); }
- 如果你确实需要把token挂载到用户对象上,将
user替换为你实际定义的existingUser即可:
try{ token = jwt.sign({userId: existingUser.id, email: existingUser.email}, process.env.JWT_KEY, {expiresIn: '1h'}); existingUser.token = token; }catch(err){ const error = new HttpError( 'Logging in failed, please try again', 500 ); return next(error); }
补充建议
后续调试时可以在catch块中打印错误详情,方便快速定位问题:
catch(err){ console.log('登录报错详情:', err); const error = new HttpError( 'Logging in failed, please try again', 500 ); return next(error); }
内容的提问来源于stack exchange,提问作者Rajan Baliwal
相关产品推荐
相关产品推荐

