使用 Meteor 获取 Facebook 好友列表
Fetching Facebook Friends List with Meteor
我添加了 meteorhacks: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>
我正在尝试通过以下方式调用 'getFriendsList':
Template.friends.helpers({
friendlist: function() {
Meteor.call("getFriendsData");
}
});
最后,我的 packages.json 看起来像这样:
{
"fbgraph": "1.1.0"
}
当我尝试 运行 我的应用程序时,出现如下错误:
Exception while simulating the effect of invoking 'getFriendsData
TypeError: Meteor.npmRequire is not a function
如果这是一个愚蠢的问题,我深表歉意,我是 Meteor 的新手。而我终其一生都无法弄清楚这一点。非常感谢您的帮助。
您需要添加 npm 模块。使用 meteorhacks:npm 模块集成 npm 模块不是 meteor 的原生功能。使用此命令安装它:
meteor add meteorhacks:npm
无论何时通过 npm 添加 non-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.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;
}
我添加了 meteorhacks: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>
我正在尝试通过以下方式调用 'getFriendsList':
Template.friends.helpers({
friendlist: function() {
Meteor.call("getFriendsData");
}
});
最后,我的 packages.json 看起来像这样:
{
"fbgraph": "1.1.0"
}
当我尝试 运行 我的应用程序时,出现如下错误:
Exception while simulating the effect of invoking 'getFriendsData
TypeError: Meteor.npmRequire is not a function
如果这是一个愚蠢的问题,我深表歉意,我是 Meteor 的新手。而我终其一生都无法弄清楚这一点。非常感谢您的帮助。
您需要添加 npm 模块。使用 meteorhacks:npm 模块集成 npm 模块不是 meteor 的原生功能。使用此命令安装它:
meteor add meteorhacks:npm
无论何时通过 npm 添加 non-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.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;
}