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

NodeJS中通过Google OAuth将数据写入多张数据库表的问题

解决Google OAuth注册时同时写入users和notes表的问题

你遇到的问题核心是添加的第二个数据库查询未正确等待执行完成,或是未处理查询中的错误,导致流程卡住、页面持续加载。以下是修正后的实现代码及关键说明:

passport.use("google",
  new GoogleStrategy(
    {
      clientID: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
      callbackURL: "http://localhost:3000/auth/google/notes",
      userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo",
    },
    async (accessToken, refreshToken, profile, cb) => {
      try {
        const result = await db.query("SELECT * FROM users WHERE email = $1", [profile.email]);

        if(result.rows.length === 0){
          // 插入新用户到users表,添加RETURNING *确保获取完整用户数据
          const newUser = await db.query(
            "INSERT INTO users (email, password) VALUES ($1, $2) RETURNING *", [profile.email, "google"]
          );
          // 等待notes表插入操作完成,再执行后续回调
          await db.query(
            "INSERT INTO notes (email) VALUES ($1)", [profile.email]
          );

          return cb(null, newUser.rows[0]);
        } else {
          return cb(null, result.rows[0]);
        }
      } catch (err) {
        console.error("Error in Google Strategy:", err);
        return cb(err);  
      }
    }
  )
);

关键注意点

  • 必须给插入notes表的db.query()加上await,确保数据库操作完成后再触发回调函数cb,避免异步操作未结束就终止流程。
  • INSERT INTO users语句添加RETURNING *,可以获取新插入用户的完整信息,如果你的notes表需要与users表通过user_id关联,可改用以下插入逻辑(更严谨):
    await db.query(
      "INSERT INTO notes (user_id, email) VALUES ($1, $2)", [newUser.rows[0].id, profile.email]
    );
    
  • 所有数据库操作都包裹在try/catch中,任何错误都会被捕获并调用cb(err),避免因未处理的错误导致流程卡住。

内容的提问来源于stack exchange,提问作者Yasas Lekamge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:43:08