我使用凭据进行了NextAuth身份验证.当我使用登录页面时,它工作得很好.

const handleSubmit = async (event:FormEvent) => {
    event.preventDefault();
    await signIn("credentials", { 
        username: inputs.username, 
        password: inputs.password, 
        callbackUrl: '/home',
    });
}

然后,我try 让用户在创建帐户后立即登录.

表单正在工作,并且帐户已在数据库中创建,但用户没有自动登录,并且我收到了凭据错误.

我猜在我的代码try 登录之前,新创建的帐户没有提交到数据库.

我为NextAuth SignIn功能添加了setTimeout,它工作得很好.所以我的猜测应该是正确的,但使用setTimeout似乎不是正确的方法.

我try 使用wait语法,以便在CreateUser()完成后进行SignIn.它不起作用.我认为是这样的,但我显然误解了一些东西.

const submitUser = async (userData: FormData) => {
    if (validatePass()) {
        await CreateUser(userData)
        signIn("credentials", { 
            username: userData.get("username"),
            password: userData.get("password"),
            callbackUrl: '/home',
        });
    }
}
export async function CreateUser(userData: FormData) {

    bcrypt.hash(userData.get("password") as string, 12, async function(err, hash) {
        try {
            await query(
                `INSERT INTO users(username, password) VALUES ($1, $2)`,
                [userData.get("username"), hash]
            )
        } catch(error) {
            return {
                message: "Error in insert"
            }
        }
    });
};

推荐答案

问题在于CreateUser函数正在将callback传递到bcrypt.hash(),但在调用回调之前返回.因此,API请求返回before行已插入数据库.

假设您正在使用nPM中的bcrypt包,它还允许您仅使用await its functions而不是传递回调:

export async function CreateUser(userData: FormData) {
  try {
    const hash = await bcrypt.hash(userData.get("password") as string, 12);
    await query(`INSERT INTO users(username, password) VALUES ($1, $2)`, [
      userData.get("username"),
      hash,
    ]);
  } catch (error) {
    return {
      message: "Error in insert",
    };
  }
}

这些更改后,您的代码片段应该可以工作:

await CreateUser(userData)
await signIn("credentials", { 
    username: userData.get("username"),
    password: userData.get("password"),
    callbackUrl: '/home',
});

Reactjs相关问答推荐

更新数据时有关CQR和更新UI的问题

Next.js-图像组件加载问题

Npm运行构建`在Next.js 14中不起作用

Reaction Axios多部分/表单-数据数组不工作

Reaction路由-如何在布局路由内呈现&q;/:id&q;路由

设置自定义形状的纹理

useRef.current.value 为空值

无法在react 中向表中添加行

React + Redux:数据未正确传递给具有动态路由的组件

Primereact 的日历组件在每个月 12 日之后使用非唯一键生成

将props 传递给 NextJS 布局组件

map 未显示在react 传单中

如何制作基于对象 struct 呈现数据的可重用组件?

当我在其中传递 2 个箭头函数时,为什么我的 onClick 事件不适用于 useState

.filter() 函数在删除函数中创建循环 - React

如何在 React 中的 Material Ui 多选中设置默认值?

如何跟踪 dexie UseLiveQuery 是否完成

CORS 政策:无访问控制允许来源-AWS 和 Vercel

Rtk 查询无效标签不使数据无效

React Router 6,一次处理多个搜索参数