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

如何实现Node.js函数等待request模块HTTP请求完成后返回结果

解决方案

你需要正确封装Promise并配合async/await实现异步等待效果,Node.js是单线程非阻塞模型,无法做到同步阻塞主线程等待请求返回,使用async/await可以实现你需要的“等HTTP请求完成后再拿结果”的业务逻辑。

你的代码问题说明

  1. Promise封装逻辑错误:你在内部定义了Promise但没有返回,也没有等待异步操作执行完成,就直接返回了初始的空对象,所以运行时会先打印空对象,请求完成后才输出resolving
  2. 存在拼写错误:请求配置里的methpd是错的,正确应为method,该错误会导致请求方法不生效
  3. CSRF重试逻辑没有整合到异步流程里,重试后的结果无法被正常返回

修正后完整代码

const request = require("request");

// CONFIG
const ROBLOSECURITY = "";
const http_header = {
    "Cookie": ".ROBLOSECURITY=" + ROBLOSECURITY
};

function MakeRbxReq(http_method, url, payload) {
    // 直接返回Promise实例
    return new Promise((resolve, reject) => {
        let jsonbody;
        try {
            jsonbody = JSON.stringify(payload);
        } catch (e) {
            return reject(new Error("Payload序列化失败:" + e.message));
        }
        const options = {
            uri: "http://" + url,
            body: jsonbody || "",
            method: http_method, // 修正拼写错误
            headers: http_header
        };

        request(options, (err, res) => {
            if (err) return reject(err);
            const methodUpper = http_method.toUpperCase();
            // 处理需要CSRF校验的请求逻辑
            if (["POST", "PUT", "PATCH", "DELETE"].includes(methodUpper)) {
                const csrfToken = res.headers["x-csrf-token"];
                if (csrfToken) {
                    http_header["X-CSRF-TOKEN"] = csrfToken;
                    options.headers = http_header;
                    // 403状态码重试请求
                    if (res.statusCode === 403) {
                        request(options, (retryErr, retryRes) => {
                            if (retryErr) return reject(retryErr);
                            resolve({
                                statusCode: retryRes.statusCode,
                                body: retryRes.body
                            });
                        });
                        return;
                    }
                }
            }
            // 普通请求直接返回结果
            resolve({
                statusCode: res.statusCode,
                body: res.body
            });
        });
    });
}

// 调用方式:在async函数中使用await等待结果
async function runRequest() {
    try {
        const result = await MakeRbxReq("GET", "search.roblox.com/catalog/json?CatalogContext=2&Subcategory=6&SortType=3&SortAggregation=5&Category=6");
        console.log(result);
    } catch (error) {
        console.error("请求执行出错:", error);
    }
}

runRequest();

调用说明

后续你需要调用MakeRbxReq的时候,都需要在async标记的函数内,用await关键字等待执行完成,才能拿到正确的请求返回值,错误可以通过try/catch捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:18:00