Вызов методов внешнего интерфейса из внешнего метеорного приложения

Я делаю докеризованное приложение на основе сервисов. Некоторые сервисы будут написаны на метеоре, некоторые нет.

Одним из сервисов является сервис регистрации, где пользователи могут зарегистрироваться на платформе.

При работе с микросервисами я обычно делаю следующее:

var MyService = DDP.connect(service_url);
var MyOtherService = DDP.connect(other_service_url);
var RegistrationService = DDP.connect(registration_service_url);

Я хочу использовать метод loginWithFacebook. Проблема в том, что использование Meteor.loginWithFacebook во внешнем интерфейсе вызовет его внутренние методы на главном внешнем сервере.

Однако я хочу вызвать его внутренние методы на сервере RegistrationService (у которого есть соответствующие пакеты). Причина в том, что я использую хук Accounts.onCreateUser для выполнения дополнительных действий, а также потому, что я хочу отделить службу регистрации от внешнего интерфейса.

Просто для ясности, хотя это и неправильно, представьте, что у меня есть это:

'click #facebook-login': function() {
  Meteor.loginWithFacebook(data, callback)
}

Однако я хочу, чтобы метод loginWithFacebook использовал методы на стороне сервера из RegistrationService при вызове метода на стороне клиента .loginWithFacebook, поэтому я действительно хочу сделать что-то, что приведет к следующему:

'click #facebook-login': function() {
  RegistrationService.loginWithFacebook(data, callback)
}

Любая помощь в этом будет принята с благодарностью. Благодарю вас!


person user2205763    schedule 08.05.2015    source источник


Ответы (2)


Я полагаю, вы ищете DDP.connect. В основном под метеором все вызовы на сервер от клиента и вся связь от сервера к клиенту используют протокол распределенных данных. (https://www.meteor.com/ddp) Как указано в документации, по умолчанию клиент открывается DDP-подключение к серверу, с которого он загружается. Однако в вашем случае вы хотели бы использовать DDP.connect для подключения к другим серверам для различных задач, таких как сервер службы регистрации для RegistrationService. (http://docs.meteor.com/#/full/ddp_connect) Как упрощенный пример, который вы будете искать, чтобы сделать что-то вроде этого:

if (Meteor.isClient) {
    var registrationServices = DDP.connect("http://your.registrationservices.com:3000");

    Template.registerSomething.events({
        'click #facebook-login': function(){
            registrationServices.call('loginWithFacebook', data, function(error, results){ ... }); // registration services points to a different service from your default.
        }
    });
}

Не забывайте, что у вас также могут быть разные DDP.connect для разных микросервисов. Они аналогичны подключениям к веб-службам в других приложениях.

person Tim C    schedule 12.05.2015
comment
Проблема в том, что когда я это делаю, я получаю сообщение TypeError о том, что RegistrationServices.loginWithFacebook не определен. В бэкэнд-приложении Meteor (для RegistrationServices) есть только папка сервера и нет папки клиента - может ли это быть проблемой? - person user2205763; 13.05.2015
comment
Нет, в этом случае вам не нужна папка клиента. По сути, в моем примере я назвал это методом на стороне клиента. Он должен вызываться как метод на стороне сервера. Я немного обновлю ответ, улучшив синтаксис, но в основном вы захотите использовать RegistrationService.call('loginWithFacebook',...); - person Tim C; 13.05.2015
comment
Ну вот, я обновил пример, чтобы он лучше работал с вызовом на стороне сервера. Дайте мне знать, как это работает. - person Tim C; 13.05.2015
comment
Я думаю, проблема в том, что «loginWithFacebook» — это метод на стороне клиента, а DDP.call будет вызывать только методы на стороне сервера. - person user2205763; 13.05.2015

Возможно, вы можете установить соединение через другую службу, указав удаленное соединение службы с Accounts и Meteor.users:

var RegistrationService = DDP.connect(registration_service_url);
Accounts.connection = RegistrationService;
Meteor.users = new Meteor.Collection('users',{connection: RegistrationService});

Затем вызовет Meteor.loginWithFacebook, и он должен использовать другие методы приложения для входа в систему.

person SylvainB    schedule 13.05.2015