登录后应用调用后端接口时Token返回Undefined的问题排查与解决
解决JWT验证后
req.user为Undefined的问题 看起来你遇到的核心问题是:调用/create-connect-account接口时,req.user返回undefined,导致后续无法获取用户信息,最终返回500错误。让我们一步步排查并修复这个问题:
1. 确保JWT中间件正确解析Token
你的requireSignin中间件使用了express-jwt,但可能存在Token提取或验证的问题。我们可以显式定义Token的提取逻辑,避免格式兼容问题:
优化中间件代码
var { expressjwt: jwt } = require("express-jwt"); export const requireSignin = jwt({ secret: process.env.JWT_SECRET, algorithms: ["HS256"], // 显式指定Token提取规则,确保正确识别Bearer格式的令牌 getToken: (req) => { if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) { return req.headers.authorization.split(' ')[1]; } return null; } });
同时请务必确认:
- 后端的
process.env.JWT_SECRET环境变量已正确加载(可以在中间件中添加console.log(process.env.JWT_SECRET)验证) - 登录接口生成Token时使用的秘钥,和中间件配置的秘钥完全一致
2. 修复控制器中的异步操作与错误处理
你的createConnectAccount控制器有两个关键问题需要修正:
问题1:未等待用户数据保存完成
user.save()是异步操作,必须添加await确保数据持久化后再继续流程:
// 原代码 user.save(); // 修改为 await user.save();
问题2:错误处理未返回具体信息
当前的错误处理没有返回任何错误详情,无法定位问题根源,修改为:
catch (error) { console.error("创建Stripe连接账户错误:", error); // 控制台打印错误便于调试 res.status(500).json({ error: error.message }); // 返回错误信息给前端 }
3. 修复登录接口的逻辑漏洞
登录接口中,当用户不存在时没有终止后续代码执行,可能导致意外的逻辑错误:
// 原代码 if (!user) res.status(400).send("User with email not found"); // 修改为(添加return终止流程) if (!user) return res.status(400).send("User with email not found");
4. 验证前端请求的正确性
确认前端调用createConnectAccount时:
- 传入的
token是登录接口返回的有效令牌(可以在前端执行console.log(token)验证) - 请求头确实携带了
Authorization: Bearer <token>(在浏览器开发者工具的Network标签中查看请求头详情)
完成以上修改后,重新测试接口,应该能正确获取req.user并正常创建Stripe连接账户了。
内容的提问来源于stack exchange,提问作者Chukwunomso Paul
相关产品推荐
相关产品推荐

