2016-01-22 3 views
2

Я добавил meteorhacks: пакет НПМ и установленный fbgraph с помощью:Fetching Facebook Список друзей с Метеор

$ 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 

Прошу прощения, если это глупый вопрос, Я довольно новичок в Метеор. И я для жизни меня не могу понять этого. Я бы очень признателен за помощь.

ответ

1

Вам необходимо добавить модуль npm. Интеграция модулей npm не является родной для метеора с помощью meteorhacks: модуль npm. Установите его с помощью этой команды:

meteor add meteorhacks:npm 

Всякий раз, когда вы добавляете пакет, не метеор через НПМ, вы должны будете использовать 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; 
} 
+0

Я уже добавил meteorhacks: пакет npm с использованием этой команды. Я даже попробовал прочитать npm-container с этими командами. Но проблема все еще сохраняется. Есть ли что-то, что я делаю неправильно? – Storm

+0

Несмотря на то, что это на стороне сервера, попробуйте явно обернуть его if (Meteor.isServer) {}, чтобы убедиться, что он выполняется только на стороне сервера, так как Meteor.npmRequire() является только серверной. Ошибка, которую вы видите, говорит нам, что она не может найти npmRequire(), поэтому либо она не установлена ​​правильно, либо выполняется где-то, что она не может ее найти (например, на стороне клиента). –

+0

Я попытался обернуть его, если (Meteor.isServer) {}, и я даже повторил meteorhacks: npm после удаления npm-container. Еще не повезло. – Storm