Meteor:客户端和服务器端的代码是什么?

时间:2014-11-13 17:24:42

标签: meteor

我只是不确切地知道我应该把什么放在服务器端以及客户端上的内容。我知道模板在客户端。但是javascript代码怎么样?你能给我一个服务器端代码的例子吗?

4 个答案:

答案 0 :(得分:5)

您可以在服务器端代码中编写所有业务逻辑和复杂数据库操作。通常,您不希望向客户提供的代码。

例如。

方法调用

# client-side
Template.post.events({
  "click #add-post": function(e) {
    var post, post_object;
    post = $("#post-message").val().trim();
    post_object = {
      user_id: Meteor.userId(),
      post: post
    };
    Meteor.call("create_post", post_object,(function(error, response) {
      if(error){
        ..do something           
      }else{
        .. do something else        
      });
    );       
  }
});

# server-side
Meteor.methods({
  create_post: function(post_object) {
    return Posts.insert(post_object);
  }
});

发布/订阅

# common
Posts = new Mongo.Collection("posts");

# client-side
Meteor.subscribe("posts");

# server-side
Meteor.publish("posts", function(limit) {
  return Posts.find({
    user_id: this.userId
  });
});

Html,css和Template管理员应该进入客户端代码。流星方法和发布者应该进入服务器端代码。详细了解应用structuring以及data security中的official docs

答案 1 :(得分:1)

以下是集合的示例:声明,发布和订阅它。

服务器和客户端(除privateclientserver之外的任何目录,也不使用public),声明集合:

Rocks = new Meteor.Collection('rocks');

服务器端(server目录或Meteor.isServer条件),发布集合:

Meteor.publish('allRocks', function()
{
    return Rocks.find();
}

客户端(client目录或Meteor.isClient条件),订阅该出版物:

Meteor.subscribe('allRocks');

您可以在documentation或此blog (Discover Meteor)中找到大量示例。

编辑:根据OP的问题获得更高的精确度...默认情况下共享所有代码(由服务器和客户端执行)。但是,serverprivate目录中的文件永远不会发送到客户端。

答案 2 :(得分:0)

  1. 如果创建一个仅发送给客户端的名为client的目录。

  2. 如果您创建一个名为server的目录,该目录仅发送给服务器。

  3. 您编写的其他任何内容都会转到客户端和服务器上。 (即使 你使用Meteor.isServer检查)

  4. 您可以阅读有关目录结构here的更多信息。

答案 3 :(得分:0)

使用Meteor.isClient和Meteor.isServer将代码加载到适当的位置。

使用文件夹:

  • 服务器 - 转到服务器duh!
  • 客户端 - 去客户端duh!
  • 两者 - 共享代码

在客户端或服务器外部放置的所有内容都会加载到这两个位置。

创建Meteor包时,您需要手动添加文件并指定应该加载的位置,例如:

api.add_files(['my-packages.js', 'another-file.js'], 'client');
api.add_files(['server/methods.js'], 'server');

在这个示例中,您在包方案中有一个server文件夹,并不意味着它被放置在服务器中

您将在客户端和服务器上运行的代码,但某些功能可能只存在于服务器或客户端。

示例:

ImageManager = {
  uploadImageToAmazonS3 : function(){
    if(Meteor.isServer){
      //your code goes here
      //YOU DON'T WANT TO SEND YOUR AMAZON PRIVATE KEY TO THE CLIENT
      //BAD THINGS CAN HAPPEN LIKE A HUGE BILL

      var amazonCredentials = Config.amazon.secretKey;
    }
    else{
      throw new Error("You can't call this on the client.");
    }
  }
}

这种情况下你可以添加客户端可以执行的功能:resizeImage,cropImage等,服务器也可以这样做,这是共享代码。向客户端发送私有API密钥是不可能的,但服务器和客户端将共享此文件。

文档:http://docs.meteor.com/#/basic/Meteor-isServer

根据文档,这不会阻止代码发送到客户端,它根本无法运行。

通过这种方法,攻击可以了解服务器上的工作原理,并可能根据您发送给他的代码尝试攻击媒介。

这里最好的选择是仅在服务器上扩展ImageManager。在客户端上,此功能甚至不应存在,或者您只需添加一个抛出错误的函数:“不可用”。