node.js:如何使用 Fiberous 从请求库返回数据

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

我正在尝试将 Fiberous 库与 request 一起使用来同步返回 HTTP 请求的正文,但我在流程方面遇到了问题。

我写了一个非常简单的辅助函数:

getPage = (url, callback)->
    request(url, (error, response, body) ->
        if error
            callback(error, null)
        if not error and response.statusCode is 200
            console.log ("got here")
            callback(null, body)
    )

如果我想将其变成同步调用,我是否只需执行以下操作:

syncRequest = fibrous((url)->
    console.log(sync.getPage("http://www.google.com"))
)

如果不是,构建代码以便我获得同步调用请求的正确方法是什么?

javascript node.js asynchronous coffeescript
2个回答
0
投票

好的,我使用以下代码完成了这个工作:

syncGETRequest = fibrous((url, options)->
    data = request.sync.get(url, options)
    console.log(data)
)

runTest = ()->
    syncGETRequest.sync("http://www.google.com", {})

fibrous.run(runTest)

0
投票

纤维依赖于纤维,现已从消息中停止:

更新 [2021 年 4 月 13 日] - Fibers 与 Nodejs v16.0.0 或更高版本不兼容。不幸的是,v8 提交 dacc2fee0f 是一个重大更改,解决方法并不简单。

我在 2023 年编写了 sync-request-curl,这将有助于发送同步 HTTP 请求。

您可以安装该库

npm install sync-request-curl

sync-request-curl 包含原始 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());

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

具体到您的

getPage
函数,您可以将其重写为

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

function getPage(url, callback) {
  try {
    const response = request('GET', url);
    if (response.statusCode !== 200) {
      throw new Error(`Request failed with status code: ${response.statusCode}`);
    }
    return response.body.toString('utf-8'));
  } catch (error) {
    // handle error
  }
}

console.log(getPage("http://www.google.com"));

希望这有帮助:)。

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