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
相关产品推荐
相关产品推荐

