Next.js搭配SWR:Passport登录成功后SWR无法持久化用户状态问题
问题排查与修复方案
核心问题1:Passport自定义登录回调未触发会话持久化
你在Passport自定义验证回调中仅手动赋值req.user = user不会将用户信息序列化写入会话,请求结束后该赋值就会失效,必须手动调用req.logIn()方法完成会话持久化,才能让后续请求识别到登录状态。
修复/api/login路由代码:
// ...原有逻辑不变 if (user) { if (user.isVerified) { // 新增:调用logIn将用户序列化存入session req.logIn(user, (err) => { if (err) { return errorHandler(err, res) } return res.status(200).send({ user: req.user, msg: `Your have successfully logged in; Welcome to Hillfinder!` }); }) } return res.status(403).send({ msg: 'Your username has not been verified! Check your email for a confirmation link.' }); } // ...原有逻辑不变
核心问题2:SWR fetcher未携带凭证请求
登录请求配置了withCredentials: true,但SWR使用的fetcher中axios请求未加该配置,导致请求/api/user时不会自动携带会话cookie,服务端无法识别用户身份。
修复hooks.js中的fetcher代码:
export const fetcher = async (url) => { try { const res = await axios.get(url, { withCredentials: true // 新增配置:请求携带cookie }); console.log("res ", res); return res.data; } catch (err) { console.log("err ", err); throw err.response.data; } };
可选优化:登录后同步SWR缓存与服务端状态
当前调用mutate(user)是直接更新本地缓存,若需要确保缓存和服务端状态完全一致,可以改成触发重新拉取验证:
// 登录成功后的mutate调用修改为 mutate('/api/user', { user }, { revalidate: true })
内容的提问来源于stack exchange,提问作者Antonio Pavicevac-Ortiz
相关产品推荐
相关产品推荐

