Невозможно вызвать функцию в пакете метеора с помощью метода?

Я пытаюсь использовать пакет геокодера, который я нашел в атмосфере (aldeed:geocoder), который использует пакет node-geocoder. Пакет метеора указывает, что для выполнения нового геокодирования я должен создать новый экземпляр GeoCoder, а затем вызвать для него метод геокодирования, передав строку адреса, например:

var geo = new GeoCoder();
var result = geo.geocode("location");

Если я помещу вышеуказанное в файл server.js в файл сервера моего приложения и результат console.log, я получу объект, напечатанный на терминале, как и ожидалось. Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь вызвать это с помощью метода метеора в ответ на ввод пользователя из окна поиска. В моем помощнике по шаблону есть это:

Template.layout.events({
    'submit form': function(e) {
        e.preventDefault();

    var search = {
        location: $(e.target).find('[name=search]').val()
    }

    console.log(search.location);

    Meteor.call('getGeoCode', search.location, function(result) {
        console.log(result)
    });
}

});

и файл коллекции, прогнозы.js, содержит это:

Forecasts = new Mongo.Collection('forecasts');


    Meteor.methods({
        getGeoCode: function(search) {
            var geo = new GeoCoder();
            result = geo.geocode(search);
            return result;
        }
    });

Но когда я пытаюсь это сделать, я получаю сообщение об ошибке в консоли, которое говорит мне, что GeoCoder не определен. Конкретно:

«Исключение при имитации эффекта вызова getGeoCode» ReferenceError: GeoCoder не определен

Итак, что здесь происходит? Почему невозможно создать новый экземпляр GeoCoder в этом методе и вызвать его, как это делаю я?


person hmlee    schedule 30.01.2015    source источник


Ответы (1)


Как видно из package.js геокодера, пространство имен GeoCoder а файлы экспортируются только на сервер. Ваша ошибка указывает на то, что метод определен на клиенте. Когда вы вызываете метод, клиент пытается запустить его версию и выдает ошибку, поскольку у него нет доступа к GeoCoder API.

Самое простое решение — просто определить этот метод в файле в вашем каталоге /server. В качестве альтернативы вы можете обернуть определение общего метода проверкой на Meteor.isServer.

person David Weldon    schedule 30.01.2015
comment
Ааааа. Итак, если метод определен в файле в каталоге /server, можно ли его по-прежнему вызывать в помощнике шаблона? - person hmlee; 30.01.2015
comment
Да, однако ваши помощники не должны иметь побочных эффектов. Работа помощника заключается в реактивном чтении и/или преобразовании данных, а не в изменении состояния. Лучшее место для вызова метода — в rendered, created или в обработчике событий. - person David Weldon; 30.01.2015