0

我正在使用这个 Facebook SDK构建一个 Express Node.js 应用程序,这是我当前的 root 路径:

app.get('/', Facebook.loginRequired(), function (req, res) {

    req.facebook.api('/me', function(err, user) {

        res.render('index', {title: 'title', user: user});

    });


});

我正在调用 FB 开放图 URL http://graph.facebook.com/me,但我想进行多个开放图调用以传递给我的模板。例如:

var APIcalls = ['/me', '/me/music', '/me/music.listens'];

req.facebook.api(APIcalls, function(err, res1, res2, res3){

    res.render('index', {res1: res1, res2: res2, res3: res3});

});

对 Facebook 进行多个 API 调用然后将响应相应地传递给我的模板的最简单方法是什么?您可以在此处查看我的完整 app.js 文件。谢谢!

4

2 回答 2

4

这种情况对于 async.map 来说似乎很完美,请参见此处:https ://github.com/caolan/async#map

async.map 方法接受一个项目数组,并对数组中的每个项目并行执行相同的异步调用。如果没有遇到错误,它将调用带有新结果数组的回调。

所以你的例子看起来像这样:

var async = require('async'),
    APIcalls = ['/me', '/me/music', '/me/music.listens'];

async.map(APIcalls, 
  function(item, callback){
    req.facebook.api(item, function(err, user) {
      if(err){
        return callback(err); 
      };
      callback(null, user);
  });},
  function(err, results){
    if(err){
      throw new Error(err);
    }
    res.render('index', results);
  }
);
于 2012-12-16T23:40:44.360 回答
1

为此,您应该使用批处理,以便您只需向 Graph API 发出一个请求即可。

FB.api('/', 'POST', {
    batch: [{
      relative_url: '/me'
    },{
      relative_url: '/me/music'
    },{
      relative_url: '/me/music.listens'
    }]
  }, function(o) {
    console.log(o);
  });

或者,您可以使用 multi-fql

FB.api('/fql', {
    q1: 'select ....',
    q2: 'select ...'
  }, function(o) {
    console.log(o);
  });

完成后,您只需将数据组合成一个模型,然后传递给渲染器。

于 2012-12-17T00:02:47.777 回答