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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:57:03