使用JWT获取用户ID返回-1,无法修改用户信息求助
问题分析与解决方案
核心问题定位
返回userId=-1说明getUserId方法未能正确解析JWT令牌,导致后续获取用户、更新信息的逻辑全部失效。结合代码和场景,主要问题集中在JWT配置错误、代码逻辑漏洞和请求头格式问题三个方面。
1. 修复JWT密钥拼写错误
在jwt.utils.js中,密钥变量名JWT_SING_SECRET是拼写错误,正确应为JWT_SIGN_SECRET(SING→SIGN)。这个错误会导致令牌验证失败,直接触发默认返回-1的逻辑:
// 错误写法 JWT_SING_SECRET // 正确写法 JWT_SIGN_SECRET
修改generateTokenForUser和getUserId方法中的密钥变量名,确保和你的环境变量/配置文件中的密钥名称一致。
2. 完善JWT验证的错误日志排查
当前getUserId方法中,try/catch块捕获异常后没有任何日志输出,无法定位验证失败的具体原因(比如令牌过期、签名不匹配)。修改代码添加日志:
getUserId: function (authorization) { let userId = -1; let token = module.exports.parseAuthorization(authorization); if (token != null) { try { let jwtToken = jwt.verify(token, JWT_SIGN_SECRET); // 注意修正密钥名 if (jwtToken != null) userId = jwtToken.userId; } catch (err) { // 添加日志,方便排查具体错误 console.error("JWT验证失败:", err.message); } } return userId; },
启动服务后发起请求,查看控制台日志,就能知道是令牌过期、签名错误还是其他问题。
3. 修正updateUserProfile中的异步回调错误
在updateUserProfile的waterfall第二个函数中,then的回调参数和done调用格式错误:
// 错误写法 .then(function (userFound, done) { done(userFound); }) // 正确写法 .then(function (updatedUser) { done(null, updatedUser); // waterfall的done第一个参数是错误对象,第二个是结果 })
原代码会导致waterfall最终回调无法正确接收更新后的用户数据,进而返回错误。
4. 检查Postman请求头格式
确保请求头中的Authorization格式正确:
- 格式必须是:
Bearer <你的JWT令牌> - 注意
Bearer后面有一个空格,令牌不能包含多余的空格或换行 - 在Postman的
Headers标签中,键填Authorization,值填Bearer xxxxxx(替换xxxxxx为实际登录时获取的令牌)
5. 验证登录接口的令牌生成逻辑
确认登录接口在生成令牌时,传入的userData.id是数据库中真实存在的用户ID(不是undefined或null)。可以在generateTokenForUser中添加日志:
generateTokenForUser: function (userData) { console.log("生成令牌的用户ID:", userData.id); // 确认ID是否正确 return jwt.sign( { userId: userData.id, isAdmin: userData.isAdmin, }, JWT_SIGN_SECRET, // 修正密钥名 { expiresIn: "1h", } ); },
如果日志中userData.id为undefined,需要检查登录接口查询用户时是否正确返回了id字段。
内容的提问来源于stack exchange,提问作者Jacques Diarra
相关产品推荐
相关产品推荐

