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

NextAuth异步函数在返回值前提前完成的问题排查

问题分析与修复方案

问题根源

你代码里的await只等了Firestore的查询完成,但then回调里的bcrypt.compare是回调式异步操作,没被包装成Promise返回,导致then默认返回undefined,data直接是undefined,所以后续的console.log("DATA " + data)先执行,而bcrypt验证完成后的CORRECT日志才后输出,出现顺序颠倒的问题。

修复后的代码

const querySnapshot = await db.collection('users').where("email", "==", email).get();
console.log("SOMETHING");
const arr = querySnapshot.docs.map(doc => doc.data());
console.log(arr);

// 先判断是否查到用户,避免arr[0]报错
if (arr.length === 0) {
    console.log("用户不存在");
    return null;
}

const user = arr[0];
if (user.email === email) {
    try {
        // 用await等待bcrypt的验证结果,替代回调形式
        const match = await bcrypt.compare(password, user.password);
        if (match) {
            console.log("CORRECT");
            return user;
        } else {
            console.log("INCORRECT");
            return null;
        }
    } catch (err) {
        console.log(err);
        return null;
    }
}
return null;

关键改动说明

  • 去掉嵌套的then回调:直接用await处理Firestore查询,代码结构更清晰,避免回调嵌套
  • 改用Promise版bcrypt.compare:bcrypt本身支持Promise,用await等待验证完成,让整个异步流程按顺序执行
  • 增加用户存在性判断:防止查询不到用户时,arr[0]导致的报错
  • 统一错误处理:用try/catch捕获bcrypt的验证错误,逻辑更健壮

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:15:24