我正在尝试将 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"))
)
如果不是,构建代码以便我获得同步调用请求的正确方法是什么?
好的,我使用以下代码完成了这个工作:
syncGETRequest = fibrous((url, options)->
data = request.sync.get(url, options)
console.log(data)
)
runTest = ()->
syncGETRequest.sync("http://www.google.com", {})
fibrous.run(runTest)
更新 [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"));
希望这有帮助:)。