【问题标题】:Making multiple requests and passing them to a template (Express + Node.js + FB open graph)发出多个请求并将它们传递给模板(Express + Node.js + FB 打开图)
【发布时间】:2012-12-17 08:02:47
【问题描述】:

我正在使用this 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 调用然后将响应相应地传递给我的模板的最简单方法是什么?你可以看到my full app.js file here。谢谢!

【问题讨论】:

    标签: javascript node.js express request


    【解决方案1】:

    这种情况似乎非常适合 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);
      }
    );
    

    【讨论】:

    • 谢谢安迪!效果很好:)
    • 不是肖恩的答案,更好地使用批处理?这意味着单个请求而不是多个并行请求?你有什么不能使用批处理的原因吗?无论如何,感谢您接受我的回答:)
    【解决方案2】:

    为此,您应该使用batching,这样您就可以摆脱对 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);
      });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 2020-06-16
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2014-11-29
      • 2021-03-01
      • 2011-08-29
      相关资源
      最近更新 更多