如何实现Node.js函数等待request模块HTTP请求完成后返回结果
解决方案
你需要正确封装Promise并配合async/await实现异步等待效果,Node.js是单线程非阻塞模型,无法做到同步阻塞主线程等待请求返回,使用async/await可以实现你需要的“等HTTP请求完成后再拿结果”的业务逻辑。
你的代码问题说明
- Promise封装逻辑错误:你在内部定义了Promise但没有返回,也没有等待异步操作执行完成,就直接返回了初始的空对象,所以运行时会先打印空对象,请求完成后才输出
resolving - 存在拼写错误:请求配置里的
methpd是错的,正确应为method,该错误会导致请求方法不生效 - 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
相关产品推荐
相关产品推荐

