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

