Получение списка друзей Facebook с помощью 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");
   }
});

Наконец, мой package.json выглядит так:

{
    "fbgraph": "1.1.0"
}

Когда я пытаюсь запустить свое приложение, я получаю следующее сообщение об ошибке:

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

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


person Storm    schedule 22.01.2016    source источник


Ответы (1)


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

meteor add meteorhacks:npm

Всякий раз, когда вы добавляете не-метеорный пакет через 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;
}
person Brett McLain    schedule 22.01.2016
comment
Я уже добавил пакет meteorhacks:npm с помощью этой команды. Я даже пытался читать npm-контейнер с помощью этих команд. Но проблема все еще сохраняется. Есть ли что-то, что я делаю неправильно? - person Storm; 22.01.2016
comment
Несмотря на то, что это на стороне сервера, попробуйте явно обернуть это с помощью if (Meteor.isServer) { }, чтобы убедиться, что он выполняется только на стороне сервера, поскольку Meteor.npmRequire() работает только на стороне сервера. Ошибка, которую вы видите, говорит нам, что она не может найти npmRequire(), поэтому либо она установлена ​​неправильно, либо выполняется где-то, где не может ее найти (например, на стороне клиента). - person Brett McLain; 22.01.2016
comment
Я попытался обернуть его вокруг if(Meteor.isServer) { } и даже переустановил meteorhacks:npm после удаления npm-container. Все равно не повезло. - person Storm; 22.01.2016
comment
Это долгий путь, но попробуйте this.fb = Npm.require('fbgraph'); Обычно это используется только при разработке пакета, но я слышал, что это работает для некоторых людей. У меня нет идей после этого :( Извините! - person Brett McLain; 22.01.2016
comment
Я только что перезапустил свое приложение, и ошибка исчезла. Но шаблон по-прежнему пуст. Я попытался запустить Meteor.call(getFriendsData) на консоли, но он ничего не вернул. Возможно, я ошибся в коде метеора. Не могли бы вы сообщить мне, если вы думаете, что что-то не так? Большое спасибо за помощь дружище :) - person Storm; 22.01.2016
comment
Обновлен мой ответ с дополнительной информацией для вас. В основном добавьте console.log() на стороне сервера, чтобы проверить, что вы возвращаете данные, и обновите помощник шаблона, чтобы правильно возвращать данные. - person Brett McLain; 22.01.2016
comment
Данные, которые я получаю, состоят только из пустого массива. Это касается как друзей, так и пользовательских данных. Как вы думаете, что мне делать? - person Storm; 22.01.2016
comment
@Storm У меня такая же проблема. Пустой массив. Вы или кто-нибудь когда-либо понимал это? - person Adam Moisa; 07.12.2016