0

この Facebook SDKを使用して Express Node.js アプリケーションを構築しています。ルートの現在のルートは次のとおりです。

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 に答える