【问题标题】:Call frontend methods from external meteor application从外部流星应用程序调用前端方法
【发布时间】:2015-07-18 22:36:11
【问题描述】:

我正在制作一个基于 dockerized 服务的应用程序。有些服务会用流星写,有些不会。

其中一项服务是注册服务,用户可以在其中注册平台。

在做微服务的时候,我通常会做以下事情:

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)
}

对此的任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: meteor meteor-accounts microservices


    【解决方案1】:

    我相信您正在寻找 DDP.connect。基本上在meteor之下,所有从客户端到服务器的调用以及从服务器到客户端的所有通信都使用分布式数据协议。 (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 连接到各种微服务。这些类似于其他应用程序中的 Web 服务连接。

    【讨论】:

    • 问题是当我这样做时,我得到一个 TypeError 说“registrationServices.loginWithFacebook”是未定义的。在后端 Meteor 应用程序(用于注册服务)上,只有一个服务器文件夹,没有客户端文件夹 - 这可能是问题吗?
    • 不,在这种情况下,您不需要客户端文件夹。基本上在我的示例中,我将其称为客户端方法。它必须作为服务器端方法调用。我会用更好的语法更新答案,但基本上你会想使用registrationService.call('loginWithFacebook',...);
    • 好了,我已经更新了示例以更好地处理服务器端调用。让我知道结果如何。
    • 我认为问题在于 'loginWithFacebook' 是客户端方法,而 DDP.call 只会调用服务器端方法。
    【解决方案2】:

    您可以通过指定服务与AccountsMeteor.users 的远程连接来实现通过其他服务的连接:

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

    然后会调用Meteor.loginWithFacebook,它应该使用其他应用程序的方法进行登录。

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多