【问题标题】:How to get a synchronuous result from an HTTP request in node.js如何从 node.js 中的 HTTP 请求中获取同步结果
【发布时间】:2016-04-11 11:58:26
【问题描述】:

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

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

所以要么我看到了一些错误,因为我对 Node.js(来自 Python)太陌生,要么我需要一种方法来使 HTTP 请求同步。

使用独立脚本,我可以使用 ChildProcess.spawnSync 轻松完成,但不是在 HTTP 请求中。

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

【问题讨论】:

  • 听起来您在需要模块时尝试获取数据,而不是让模块为您提供可以调用初始化函数然后返回承诺的对象。

标签: javascript node.js asynchronous http-post synchronous


【解决方案1】:

您可以使用 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

【讨论】:

  • 我不确定我是否理解正确。假设我在 Node 中找到了一个使用工作程序的模块(示例来自 Mozilla),这不会同步 return 值。如果我没记错的话,这种方法可以让我将实际的 HTTP 请求封装在同步调用中,但从调用者的角度来看,这似乎仍然是异步的。还是我错过了什么?
  • 这取决于你想要达到什么,以及为什么。如果您可以提供有关该问题的更多详细信息,我可以相应地更新答案。
  • 好的,触发我工作的用例(其他也可以):我正在编写一个 Gitbook 插件 (toolchain.gitbook.com/plugins)。每当在页面生成过程中找到模板块时,gitbook 调用插件,将模板传递给函数并期望替换字符串作为返回值。当我需要发出 HTTP 请求以生成替换字符串时,此请求需要同步,因为我必须返回一个值。据我所知,我不能为此使用回调函数。 ...
  • ... 还有另一个层次的复杂性(但我不确定它是否真的增加了一些新东西):我实际上写的是一个通用的 node.js将为任何客户端执行 HTTP 请求的模块。 Gitbook 插件将调用新节点模块中的函数,但当然它也必须期望同步返回值。
  • sync-request 似乎是我正在寻找的东西,谢谢。现在我很难让实际请求正常工作(从响应对象中获取消息“解析错误”),但这是另一个问题。所以我可以考虑关闭这个。
猜你喜欢
  • 2018-10-31
  • 2018-02-14
  • 2018-12-15
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多