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

