Node.js调用Steam API时序异常,函数调用方无法获取请求返回数据
问题根因
- 你使用的
request库为回调风格的异步API,无法被async/await自动识别等待,代码循环触发请求后直接执行了return操作,此时请求回调还未执行,因此返回的数组是空的 - async/await仅能等待Promise对象的执行结果,你没有将回调式的请求逻辑包装为Promise,
await myfunction()实际仅等待了函数的同步逻辑执行完成,未等待异步请求返回 - 现有代码中请求的body参数写死了Mod ID,没有用到遍历的变量,后续新增Mod ID时会导致查询结果错误
修复方案
首先用Node内置的util.promisify将回调式的request.post转为返回Promise的方法,再通过await等待每个请求完成后再返回结果:
import request from 'request'; import { promisify } from 'util'; // 将回调风格的post方法转为返回Promise的方法 const requestPost = promisify(request.post); const myfunction = async function(x, y) { const arrMODID = ["2016338122"]; const modinfoArray = []; for (const modId of arrMODID) { // 等待当前请求完成再执行后续逻辑 const { body } = await requestPost({ headers: {'content-type' : 'application/x-www-form-urlencoded'}, url: 'http://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1', body: `itemcount=1&publishedfileids[0]=${modId}`, // 动态传入遍历到的Mod ID }); const response = JSON.parse(body); const myResponse = response.response.publishedfiledetails; myResponse.forEach(arrayItem => { modinfoArray.push({[modId]: arrayItem.time_updated}); }); } return ["test", modinfoArray]; }; const start = async function(a, b) { try { const result = await myfunction(); console.log(result); } catch (e) { // 捕获请求报错,避免程序崩溃 console.error('请求出错:', e); } } start();
优化建议
- 可以用
Promise.all实现并发请求,相比循环逐个等待的方式大幅提升查询速度 - 老版本
request库已经停止维护,建议后续替换为axios或者Node18+内置的fetch方法 - Steam的该接口支持批量查询,可以一次性传入多个Mod ID,减少请求次数提升性能
内容的提问来源于stack exchange,提问作者comical_uk
相关产品推荐
相关产品推荐

