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

