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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:46:11