2012-12-16 8 views
0

내가 this Facebook SDK를 사용하여 익스프레스 Node.js를의 appication를 구축하고, 여기에 루트에 대한 내 현재 다른 루트하고 여러 요청 만들기 및 템플릿에 전달 :(익스프레스 + Node.js를 + FB 오픈 그래프)

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 호출을하고 이에 따라 내 템플릿에 응답을 전달하는 가장 쉬운 방법은 무엇입니까? my full app.js file here을 볼 수 있습니다. 감사! 이 시나리오는 async.map 완벽한 보인다

답변

4

는 여기를 참조하십시오 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); 
    } 
); 
+0

감사합니다. Andy! 매우 잘 작동합니다 :) – mager

+0

Sean의 대답은 일괄 처리를 사용하는 것이 더 낫지 않습니까? 병렬로 여러 개가 아닌 단일 요청을 의미합니까? 일괄 처리를 사용할 수없는 이유가 있습니까? 어쨌든 내 대답을 수락 주셔서 감사합니다 :) – AndyD

1

이 들어 당신이 그렇게 batching를 사용해야합니다 당신이 그래프 API에 불과 하나의 요청과 함께 멀리 얻을 수 :

그래서 당신의 예는 다음과 같이 보일 것입니다. 이 작업이 완료되면

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

은 또는 당신은 단순히 당신이 렌더러에 전달 단일 모델로 데이터를 결합, 멀티 FQL에게

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

를 사용할 수 있습니다.