使用Meteor获取Facebook好友列表

使用Meteor获取Facebook好友列表,facebook,facebook-graph-api,meteor,facebook-friends,Facebook,Facebook Graph Api,Meteor,Facebook Friends,我添加了MeteoHacks:npm包,并使用以下方式安装了fbgraph: $ npm install fbgraph 目前,我的服务器端代码如下所示: function Facebook(accessToken) { this.fb = Meteor.npmRequire('fbgraph'); this.accessToken = accessToken; this.fb.setAccessToken(this.accessToken); this.opt

我添加了MeteoHacks:npm包,并使用以下方式安装了fbgraph:

$ npm install fbgraph
目前,我的服务器端代码如下所示:

function Facebook(accessToken) {
    this.fb = Meteor.npmRequire('fbgraph');
    this.accessToken = accessToken;
    this.fb.setAccessToken(this.accessToken);
    this.options = {
        timeout: 3000,
        pool: {maxSockets: Infinity},
        headers: {connection: "keep-alive"}
    }    
    this.fb.setOptions(this.options);
}
Facebook.prototype.query = function(query, method) {
    var self = this;
    var method = (typeof method === 'undefined') ? 'get' : method;
    var data = Meteor.sync(function(done) {
       self.fb[method](query, function(err, res) {
           done(null, res);
       });
   });
   return data.result;
}
Facebook.prototype.getUserData = function() {
return this.query('me');
}
Facebook.prototype.getFriendsData = function() {
    return this.query('/me/friendlists');
}
Meteor.methods({
    getUserData: function() {
       var fb = new Facebook(Meteor.user().services.facebook.accessToken);
       var data = fb.getUserData();
       return data;
       },
    getFriendsData: function() {
       var fb = new Facebook(Meteor.user().services.facebook.accessToken);
       var data = fb.getFriendsData();
       return data;
    }
});

Meteor.publish("getUserData", function () {
    return Meteor.users.find({_id: this.userId});
});

Meteor.publish("getFriendsData", function(){
    return Meteor.users.find({_id: this.userId});
});
我的config.js也是有序的,我认为:

Accounts.ui.config({
    passwordSignupFields: "USERNAME_ONLY",
    requestPermissions: {
        facebook: ['email', 'user_friends'],
    }
});
在客户端,我有一个模板:

<template name="friends">
    <div class="container">
        {{friendlist}}
    </div>
</template>
Template.friends.onCreated(function() {
    Meteor.call("getFriendsData", function(error, friends) {
        if (error) {
            console.log(error);
        } else {
            Session.set('friends', friends);
        }
    });
});

Template.friends.helpers({
   friendlist: function() {
       return Session.get('friends');
   }
});
最后,my packages.json如下所示:

{
    "fbgraph": "1.1.0"
}
当我尝试运行我的应用程序时,出现如下错误:

Exception while simulating the effect of invoking 'getFriendsData
TypeError: Meteor.npmRequire is not a function

如果这是一个愚蠢的问题,我很抱歉,我对Meteor还相当陌生。我一辈子都搞不懂这个。非常感谢您的帮助。

您需要添加npm模块。npm模块的集成不是meteor与meteorhacks:npm模块的固有特性。使用以下命令安装它:

meteor add meteorhacks:npm
无论何时通过npm添加非meteor包,都必须使用
meteor.npmRequire()
。如果通过meteor add foobar安装,则不需要该软件包

如果您有问题,请尝试使用Meteor 1.2:

rm -rf packages/npm-container
meteor remove npm-container
meteor update meteorhacks:npm
此外,您的模板还需要修复,因为它当前不会根据Meteor.call()进行更新。如果使用onCreated()或onRendered(),则可以触发Meteor.call()并设置一个会话变量,您的助手将使用该变量填充模板:

<template name="friends">
    <div class="container">
        {{friendlist}}
    </div>
</template>
Template.friends.onCreated(function() {
    Meteor.call("getFriendsData", function(error, friends) {
        if (error) {
            console.log(error);
        } else {
            Session.set('friends', friends);
        }
    });
});

Template.friends.helpers({
   friendlist: function() {
       return Session.get('friends');
   }
});
如果您没有从服务器端获取任何数据,请更改此选项以检查您是否正在从服务器端获取数据:

getFriendsData: function() {
   console.log(Meteor.user().services.facebook.accessToken);
   var fb = new Facebook(Meteor.user().services.facebook.accessToken);
   var data = fb.getFriendsData();
   console.log(data);
   return data;
}

我已经使用该命令添加了meteohacks:npm包。我甚至试着用这些命令读取npm容器。但问题依然存在。有什么我做错了吗?即使这是在服务器端,也要尝试用if(Meteor.isServer){}显式地包装它,以确保它只在服务器端执行,因为Meteor.npmRequire()只在服务器端执行。您看到的错误告诉我们它找不到npmRequire(),因此它要么安装不正确,要么在找不到它的地方执行(即客户端)。我尝试将它包装在if(Meteor.isServer){}上,甚至在删除npm容器后重新安装了meteorhacks:npm。仍然不走运。这是一个很长的机会,但请尝试
this.fb=Npm.require('fbgraph')通常这只在开发包时使用,但我听说这对某些人有用。在这之后我就没有主意了:(抱歉!我刚刚重新启动了我的应用程序,错误消失了。但是模板仍然是空的。我试着在控制台上运行“Meteor.call”(“getFriendsData”)。但它没有返回任何信息。我可能在Meteor代码中出错。如果你认为有什么问题,可以告诉我吗?非常感谢你的帮助,伙计:)