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

NodeJS AWS Lambda函数执行顺序问题:currentTournamentId返回undefined

解决AWS Lambda中NodeJS异步函数顺序问题(currentTournamentId返回undefined)

问题根源

核心问题出在getCurrentTournamentIdByWeekNumber函数的异步处理逻辑上:

  • 函数内部创建了Promise,但没有将这个Promise或其处理后的结果作为函数返回值,导致await该函数时得到undefined。
  • 你在promise.then()回调里返回的tournId,仅属于回调函数的返回值,无法向上传递到外层函数的返回结果中。

解决方案

需要让getCurrentTournamentIdByWeekNumber返回一个完整的Promise链,确保最终能resolve到过滤后的tournId,或在未找到时抛出异常。以下两种修改方式都可以解决问题:


方式一:在Promise内部完成数据过滤

直接在Promise的end回调中处理数据过滤,找到对应tournId后直接resolve,未找到则reject错误:

function getCurrentTournamentIdByWeekNumber(currentWeekNumber) {
  // 必须返回创建的Promise
  return new Promise((resolve, reject) => {
    const options = {
      host: 'MY_HOST',
      path: '/MY_PATH',
      headers: {
        'key': 'value'
      }
    };

    const req = https.get(options, res => {
      let rawData = '';

      res.on('data', chunk => {
        rawData += chunk;
      });

      res.on('end', () => {
        try {
          const result = JSON.parse(rawData);
          // 遍历schedule查找对应周数的tournId
          for (let i = 0; i < result.schedule.length; i++) {
            let weekNumber = result.schedule[i].date.weekNumber;
            if (currentWeekNumber == weekNumber) {
              resolve(result.schedule[i].tournId); // 直接resolve找到的ID
              return; // 找到后终止后续逻辑
            }
          }
          // 遍历完未找到,抛出错误
          reject(new Error(`No tournament found for week ${currentWeekNumber}`));
        } catch (err) {
          reject(new Error(err));
        }
      });
    });

    req.on('error', err => {
      reject(new Error(err));
    });
  });
}

方式二:返回处理后的Promise链

如果希望保持Promise与数据过滤逻辑分离,可返回promise.then()的结果(then会返回新的Promise,最终resolve到回调的返回值):

function getCurrentTournamentIdByWeekNumber(currentWeekNumber) {
  const promise = new Promise((resolve, reject) => {
    const options = {
      host: 'MY_HOST',
      path: '/MY_PATH',
      headers: {
        'key': 'value'
      }
    };

    const req = https.get(options, res => {
      let rawData = '';

      res.on('data', chunk => {
        rawData += chunk;
      });

      res.on('end', () => {
        try {
          resolve(JSON.parse(rawData));
        } catch (err) {
          reject(new Error(err));
        }
      });
    });

    req.on('error', err => {
      reject(new Error(err));
    });
  });

  // 返回then处理后的Promise链
  return promise.then(result => {
    for (let i = 0; i < result.schedule.length; i++) {
      let weekNumber = result.schedule[i].date.weekNumber;
      if (currentWeekNumber == weekNumber) {
        return result.schedule[i].tournId;
      }
    }
    // 未找到时抛出错误,会被外层try/catch捕获
    throw new Error(`No tournament found for week ${currentWeekNumber}`);
  });
}

修改后效果

修改后的函数会返回一个可被await等待的Promise,确保currentTournamentId能拿到正确的ID值后,再执行getLeaderboardByTournId函数。同时,未找到对应tournament的情况会被外层try/catch捕获,返回明确的错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:10:31