我正在尝试使用 Facebook Graph API 递归获取我的所有 Facebook 帖子。
对 Facebook API 的简单 GET 请求不会返回我的所有帖子。相反,它返回一个分页响应。
{"data": [
{Facebook post},
{Facebook post},
{Facebook post}.
etc
],
"paging": {
"next":Url (api endpoint) to next page of results
}
}
因此,我必须递归地在 paging.next 上发出 GET 请求来检索我的所有帖子。
使用同步 HTTP 请求来完成此操作很容易。但我正在使用 NodeJS,而且我一直听说我应该保持异步。因此,我将 HTTP GET 请求方法更改为“异步”。 为了获得异步 HTTP GET 请求的一些控制流,我使用了
asyncnpm 模块;特别是,async.waterfall 这是我的带有 async.waterfall 的
recursion 函数:
function getAllPosts(responseObj, masterPosts) {
masterPosts = typeof masterPosts !== 'undefined' ? masterPosts : {'data':[]};
var posts = responseObj['data'];
masterPosts['data'] = masterPosts['data'].concat(posts);
if (responseObj.hasOwnProperty('paging') && responseObj['paging'].hasOwnProperty('next')) {
var r;
async.waterfall([
function(callback){
r = httpGet(responseObj['paging']['next']);
callback(null, r);
},
function(arg1, callback){
getAllPosts(JSON.parse(arg1), masterPosts);
callback(null, 'done');
},
], function (err, result) {
//result now == 'done'
});
}
return masterPosts;
}
函数是异步的。我尝试了这个,但不起作用:(我的结果仍然只有我的 Facebook 帖子的一半。 函数参数
responseObj是一个JavaScript对象~刚刚解析了分页的JSON响应 我在这里缺少什么?
,我在 2023 年编写的一个库,将帮助使用 libcurl 的 Easy 接口发送同步 HTTP 请求。
npm:中功能的子集,但利用 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());
请查阅文档以获取更多示例。
具体到你的情况,你可以重写如下:
const request = require('sync-request-curl');
function getAllPosts(responseObj, masterPosts) {
masterPosts = masterPosts ?? { data: [] };
masterPosts.data.push(...responseObj.data);
if (responseObj.paging?.next) {
const response = request('GET', responseObj.paging.next);
const nextResponse = JSON.parse(response.body.toString());
getAllPosts(nextResponse, masterPosts);
}
return masterPosts;
}
希望这有帮助:)。