了解MeteorJS和同构Javascript

时间:2015-05-27 01:59:58

标签: javascript meteor

在我之前的Web开发经验中,我一直都在使用LAMP堆栈。截至最近,我已经迷上了MEAN堆栈,并构建了一些简洁的小应用程序。继续前进,我听到Meteor在IRC聊天中提到并决定跳上带状线。

过去一周,我一直在尝试在Meteor中设置应用程序。我开始计划简洁的结构并记录控制流程,但是当它进入实际的应用程序时,我开始在开发过程中迷失自我。我的问题是,我并不是真正理解同构的javascript。

使用Meteor,何时执行服务器代码?服务器代码超出了客户端的范围,因为它应该是出于安全目的,但它实际上是如何同构的?我知道mongo-client,我发现它非常漂亮。虽然我应该如何构建Meteor中的应用程序?

假设我正在为“用户”创建一个控制器,这个控制器将被加载到两个可能的解决方案中。

./服务器/ app.js

$scope.controller = {  };
if( !$scope.session.exists )
{
  $scope.controller =
  {
    authenticate: function(email, password) {
      // authenticate credentials and create session
    },
    create: function(form) {
      // create new user
    }
  };
}
else
{
  $scope.controller =
  {
    end: function(call) {
      try {
        call();
      } catch(err) {
        // do nothing, optional callback
      }

      // end user session
    }
  };
}

上述代码如何与我的客户端代码保持一致?如果我创建一个简单的登录表单

./客户/ login.html的

<template name="login">
  <form>
    <input type="text" name="email" placeholder="Email Address">
    <input type="password" name="password" placeholder="Password">
    <button type="submit">Login</button>
  </form>
</template>

./客户/ login.js

Template.login.events({

  // handle the form submission
  'submit form': function(event) {

    // stop the form from submitting
    event.preventDefault();

    // ???
      // event.target.email.value
      // event.target.password.value
  }

});

此模板事件如何使用 $ scope.controller.authenticate ?好吧,它不能,因为身份验证只在服务器上。因此,我需要将身份验证过程转移到客户端,这没有任何意义,因此让我的大脑麻木于同构javascript的意识形态。

我知道这些问题有些模糊,但简单来说,Meteor中服务器端和客户端代码之间的关系程度是多少?

1 个答案:

答案 0 :(得分:1)

前言:似乎你在后端使用Angular,但Meteor应该是开箱即用的自给自足(你当然可以集成其他框架,如Angular,但它有时是hacky而不是必需的)。

在Meteor中,客户端和服务器之间的“通信”以两种方式工作:

  1. 数据库反应性:根据每个集合的allow / deny规则,客户端可以直接与客户端数据库(miniMongo)进行交互。此类交互(删除,更新等)将在服务器数据库上复制(并根据您的允许/拒绝规则进行验证以确保安全性)。请注意,任何应用程序都附带安装的不安全软件包,允许从客户端对数据库进行全面控制(用于原型设计,但这可能令人困惑)。

  2. Methods(IMO的最佳方式,也是互补的):这是Meteor可能真正同构的部分。方法只能在服务器上声明,可以从客户端访问,也可以在客户端和服务器上声明(例如,位于 / client / server 之外的文件中)。在第一种情况下,客户端将调用该方法并在Meteor.call回调中等待来自服务器的答案,在第二种情况下,客户端将调用该方法,但该方法将在客户端和服务器上运行,服务器实际上做的工作和客户端模拟方法,以补偿客户端和服务器之间的延迟(并给用户留下即时印象)。如果服务器上的结果不同(即修改后的数据不同),则客户端的方法结果将失效并恢复。

  3. 方法如下所示(没有延迟补偿的例子),我认为这是你目前正在寻找的:

    //SERVER
    Meteor.methods({
      doSomething: function (params) {
        //method logic
      },
      doSomethingElse: function (params) {
        //method logic
      }
    });
    
    //CLIENT
    Meteor.call('doSomething', params, function (error, result) {
      //get the error or the result of the call
    });
    

    您必须记住,Meteor实际上是通过publish / subscribe进行数据同步。您将在方法内部执行的许多操作将在数据库修改中进行转换,然后通过反应性同步到客户端(前提是这些数据在客户端上发布)。 因此,根据您的出版物/订阅,您可能不需要像通常的应用程序那样处理服务器调用和结果,即您可以调用该方法而不执行任何其他操作,因为数据将通过发布自动同步。