You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:45:03