我正在编写一个节点模块作为 Python 模块的包装器(以使该模块可从 node.js 中使用)。该模块作为独立脚本或 HTTP 服务器工作。
从该脚本/服务器获取数据时,我的函数需要返回一个值,并且不能在回调函数中执行某些操作。至少我是这么理解的。
(一种可能的客户端是 gitbook-plugin,当遇到“块”时,它必须调用插件->my-client-module 并将其返回值插入到生成的 HTML 文档中。)
因此,要么我发现了一些问题,因为我对 Node.js(来自 Python)太陌生,要么我需要一种方法来使 HTTP 请求同步。
通过独立脚本,我可以使用 ChildProcess.spawnSync 轻松完成此操作,但不能在 HTTP 请求中完成。
嗯,我知道人们总是建议在 Node 中异步执行操作,所以我也很高兴了解如何以这种方式实现我的目标。如前所述,我希望模块的客户端向我传递一些数据,传递这些数据以调用脚本或在服务器上执行 POST 请求并将处理后的数据返回给客户端。
您可以使用 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
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);
}
希望这有帮助:)