如何在node.js中从HTTP请求获取同步结果

问题描述 投票:0回答:2

我正在编写一个节点模块作为 Python 模块的包装器(以使该模块可从 node.js 中使用)。该模块作为独立脚本或 HTTP 服务器工作。

从该脚本/服务器获取数据时,我的函数需要返回一个值,并且不能在回调函数中执行某些操作。至少我是这么理解的。
(一种可能的客户端是 gitbook-plugin,当遇到“块”时,它必须调用插件->my-client-module 并将其返回值插入到生成的 HTML 文档中。)

因此,要么我发现了一些问题,因为我对 Node.js(来自 Python)太陌生,要么我需要一种方法来使 HTTP 请求同步。

通过独立脚本,我可以使用 ChildProcess.spawnSync 轻松完成此操作,但不能在 HTTP 请求中完成。

嗯,我知道人们总是建议在 Node 中异步执行操作,所以我也很高兴了解如何以这种方式实现我的目标。如前所述,我希望模块的客户端向我传递一些数据,传递这些数据以调用脚本或在服务器上执行 POST 请求并将处理后的数据返回给客户端。

javascript node.js asynchronous http-post synchronous
2个回答
0
投票

您可以使用 web-workers 实现同步 HTTP 请求。
以下是有关此主题的更多信息:
https://developer.mozilla.org/zh-TW/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests#Example_Synchronous_HTTP_request_from_a_Worker


编辑:

您可以从 Node.Js 发出同步请求。以下模块应该有所帮助: https://www.npmjs.com/package/sync-request


0
投票

2023 年,我写了 sync-request-curl。该库将帮助使用 libcurl 的 Easy 界面发送同步 HTTP 请求。

该库包含原始 sync-request 中功能的子集,但利用 node-libcurl 以获得更好的性能和 NodeJS 的附加 libcurl 选项。

这是 GET 请求的基本用例:

// import request from 'sync-request-curl';
const request = require('sync-request-curl');
const response = request('GET', 'https://ipinfo.io/json');
console.log('Status Code:', response.statusCode);
console.log('body:', response.body.toString());
console.log('json:', JSON.parse(response.body.toString());

请查阅文档以获取更多示例。

关于您对已接受答案的评论:

现在我很难让实际请求正常工作(从响应对象中获取消息“解析错误”)

这可能是尝试

JSON.parse
一个非 JSON 的字符串的结果 - 例如服务器用 HTML 进行响应。您可以通过检查状态代码 200 或简单地将其包装在 try/catch 语句中来处理错误。这是一个封装两者的示例:

const request = require('sync-request-curl');

try {
  const response = request('GET', 'https://ipinfo.io/json');
  if (response.statusCode !== 200) {
    throw new Error(`Request failed with status ${response.statusCode}`);
  }

  // This will also throw an error if response.body.toString() is not a JSON
  console.log('json:', JSON.parse(response.body.toString());
} catch (error) {
  console.log(error);
}

希望这有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.