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

如何确保数据库插入提交后再执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:43:29