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

MongoDB结合OAuth谷歌认证时无法新增用户数据,集合未更新

问题根因

  • Passport的Google策略校验回调必须调用done()方法通知Passport校验完成,你当前代码完全没调用该方法,会导致认证流程卡住,新增用户的异步save()操作可能还没执行完,请求就被中断。
  • save()是异步Promise操作,你没有等待它执行完成就结束了逻辑,很容易出现操作没落地就流程终止的情况。
  • 没有对数据库操作添加错误捕获,出现异常时无法感知具体报错原因。

修复后的认证逻辑代码

const passport = require("passport");
const GoogleStrategy = require("passport-google-oauth20").Strategy;
const mongoose = require("mongoose");
const keys = require("../config/keys");

const User = mongoose.model("users");

passport.use(
  new GoogleStrategy(
    {
      clientID: keys.googleClientID,
      clientSecret: keys.googleClientSecret,
      callbackURL: "/auth/google/callback",
    },
    async (accessToken, refreshToken, profile, done) => {
      try {
        const existingUser = await User.findOne({ googleId: profile.id });
        if (existingUser) {
          // 已有用户直接返回
          return done(null, existingUser);
        } 
        // 新用户等待save完成后再返回
        const newUser = await new User({ googleId: profile.id }).save();
        return done(null, newUser);
      } catch (err) {
        // 捕获错误传给done
        return done(err, null);
      }
    }
  )
);

额外排查项

如果修改后仍无法写入数据,请检查以下配置:

  • 确认Mongoose数据库连接已正常初始化,启动日志没有连接报错
  • 确认已实现Passport的序列化/反序列化逻辑,示例如下:
passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser(async (id, done) => {
  const user = await User.findById(id);
  done(null, user);
});
  • 确认路由中正确注册了Passport的回调路由,示例:
app.get('/auth/google/callback', 
  passport.authenticate('google'),
  (req, res) => {
    // 认证成功后的跳转逻辑
    res.redirect('/');
  }
);

内容的提问来源于stack exchange,提问作者Basit Qayoom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:36:00