JavaScript异步函数执行顺序异常:登录认证await失效问题排查
问题分析与解决方案
核心问题原因
你的isAuthenticated函数虽然标记为async,但没有返回一个可被await捕获的有效Promise,导致await isAuthenticated(...)直接得到undefined,后续判断逻辑自然会提前执行:
User.findOne的回调版本中,回调函数里的return只是回调自身的返回值,不会传递给外层的isAuthenticated函数。async函数如果没有显式返回值,会默认返回一个状态为resolved、值为undefined的Promise,所以await后得到的userID必然是undefined。
修正方案
1. 重构isAuthenticated函数,使用Promise/await风格
Mongoose的findOne方法本身支持Promise,直接去掉回调,改用await获取结果,让函数真正返回一个带有效数据的Promise:
const isAuthenticated = async (username, password) => { try { // 改用await获取findOne的结果 const foundUser = await User.findOne({ username: username }); if (!foundUser) { return 0; } if (foundUser.password === password) { console.log("ID:", foundUser.id); console.log("NAME:", foundUser.username); return foundUser.id; } // 密码不匹配时也返回0 return 0; } catch (err) { console.log(err); // 数据库错误时可返回0或抛出错误,根据业务需求调整 return 0; } };
2. 修正登录路由中的token生成逻辑
原来的createToken({ id: isAuthenticated(userName, password) })会传入一个Promise对象,需要直接使用已经await过的userID:
// 替换原来的token生成代码 const accessToken = createToken({ id: userID });
额外注意事项
- 密码安全性:使用
md5加密密码非常不安全,建议改用bcrypt等带盐值的哈希算法,避免明文/弱哈希存储密码。 - 错误处理:数据库查询错误时,除了打印日志,还可以根据业务需求抛出错误或返回特定状态码,让前端得到更准确的错误信息。
内容的提问来源于stack exchange,提问作者koji tanaka
相关产品推荐
相关产品推荐

