如何确保数据库插入提交后再执行NextAuth自动登录?
问题根源
你的CreateUser函数虽然加了async,但内部用了bcrypt.hash的回调写法,导致await CreateUser(userData)根本没等哈希计算和数据库插入完成,就直接跑去执行signIn了。回调里的异步操作和CreateUser的Promise链脱节,函数会立刻返回空Promise,这时候数据库里还没写入新用户,signIn自然拿不到凭证,报错也就不奇怪了。
解决方法
把bcrypt.hash换成Promise版本(bcrypt本身支持Promise,没必要用回调),让整个CreateUser的异步流程被正确包裹,这样await才能真正等待操作完成:
修改后的CreateUser函数
export async function CreateUser(userData: FormData) { try { // 用await等待bcrypt哈希完成 const hash = await bcrypt.hash(userData.get("password") as string, 12); // 哈希完成后再执行数据库插入,同样用await等待完成 await query( `INSERT INTO users(username, password) VALUES ($1, $2)`, [userData.get("username"), hash] ); } catch(error) { return { message: "Error in insert" } } };
原submitUser逻辑只需加个await给signIn
const submitUser = async (userData: FormData) => { if (validatePass()) { await CreateUser(userData) // 现在数据库已经写入新用户,再调用signIn就不会出错了 await signIn("credentials", { username: userData.get("username"), password: userData.get("password"), callbackUrl: '/home', }); } }
额外提醒
- 别忘给
signIn也加await,确保登录流程走完再处理后续(比如页面跳转)。 - 尽量别把回调式API和async-await混着用,很容易搞乱异步顺序,统一用Promise/async-await风格的代码更稳妥。
内容的提问来源于stack exchange,提问作者Busu
相关产品推荐
相关产品推荐

