2014-10-21 67 views
0

所以我喜欢使用匿名函数进行编码,而Meteor.methods会为我打破这一点。所以,我创建了一个Meteor.Methods这样Meteor.Methods在一个函数中,可能的架构解决方案

//服务器端

Meteor.startup(function() { 
    // code to run on server at startup 
    //expose server methods. 

     Meteor.methods({ 
      _SERVER_ : function(args){ 
       try{ 
        var funcStr = args.func.split("."); //split on the function parameter 
        var scopeStr = funcStr[0]; //get the scope of the function 
        funcStr.splice(0,1); //remove the scope and get the deep path 

        var path = funcStr.join("."); //join the array and stick it with "." 

        console.log("util.funcString("+ scopeStr +","+ path +")(" + args.data + ");"); 

        if(myapp.hasOwnProperty(scopeStr)) //see if the function exist on myapp object 
        { 
         var scope = myapp[scopeStr]; //get the scope of the function 
         var response = util.funcString(scope, path)(args.data); //execute the function 
         console.log("myapp :" + args.func); 

         return response; 

        }else{ 
         return "myapp don't have the method: " + args.func; 
        } 

       }catch(e){ 
        return "myapp has a wtf moment and its saying:" + e; 
       } 
      } 
     }); 
    }); 

所以相当多的功能,期待从客户端这样的电话。而其会打电话给myapp.page.add

//客户端

Meteor.call("_SERVER_",{ 
      func : "pages.add", 
      data : page 
     },function(err, value){ 
      insertNewPage(err,value); 
     }); 

的好处是现在我可以在服务器端这样创建一个函数。

//服务器端

myapp.page = (function(){ 

     var privateVar = "private"; 

     //private 
     function doSomething(){ 
     } 

     //public via the return object 
     function add(){ 
      console.log("called from client side"); 
     } 

     return{ 
      add : add 
     } 
    })(); 

而且我的应用程序现在它更像是模块化的,可在不同的文件和创建任何你想要的名称空间分开很简单。

问题DO我打破任何METEOR规则?它不是安全的?它是一个坏主意?任何建议都是值得欢迎的,我在Meteor还是个新手。

THANKS

+0

你知道你可以多次调用Meteor.methods吗?所以你可以用'Meteor.methods({“pages.add”:function(){.... something ...}});' – stubailo 2014-10-21 23:40:42

+0

复制上面的'我没有,这就是为什么我问。 – ncubica 2014-10-21 23:48:18

+0

但仍然需要为每个函数声明Meteor.Methods中的方法。它不仅仅是一次呼吁在客户端统治他们。 – ncubica 2014-10-21 23:49:57

回答

2

您可以替换此:

myapp.page = (function(){ 

    var privateVar = "private"; 

    //private 
    function doSomething(){ 
    } 

    //public via the return object 
    function add(){ 
     console.log("called from client side"); 
    } 

    return{ 
     add : add 
    } 
})(); 

有:

myapp.page = (function(){ 

    var privateVar = "private"; 

    //private 
    function doSomething(){ 
    } 

    //public via the return object 
    function add(){ 
     console.log("called from client side"); 
    } 

    Meteor.methods({ 
     "page.add": add 
    }); 
})(); 

如果你想打电话给你的方法与Meteor.call("page.add", arg1, arg2)

此外,由于Meteor会自动在文件之间自动确定变量的范围,因此不需要在privateVar周围关闭。

+0

这是更好,我有什么。好的解决方案和不错的提示 – ncubica 2014-10-22 00:21:29

+0

我现在看到它的那个page.add不是一个命名空间的唯一问题,对吧?如果你有例如'myapp2.page =()'你现在不能使用'page.add',或者我错了吗? – ncubica 2014-10-22 00:23:58

+1

方法定义的位置并不重要。整个Meteor项目是一个“应用程序”。如果您希望对范围进行非常详细的控制,您可能希望将代码放入一个包中,但我会注意不要过度优化模块化。您也可以从服务器调用Meteor方法,因此可以从应用程序,客户端或服务器的任何位置访问“page.add”。 – stubailo 2014-10-22 03:16:47

1

你在做什么混淆了Meteor努力做的事情:让开发人员更简单。流星给你最简单,最直接的方式来完成自从我在C初期就已经见过的事情。你只需编写干净的代码来做你想做的事。流星使用网络应用程序来做到这一点,这是一件非常美丽的事情。底线:如果您在Meteor代码中添加间接层,您可能会过度解决问题。放轻松。 :-)将客户端的东西保存在客户端/服务器中的服务器/以及其外部的共享内容。享受简单。

+0

好吧我会尝试从简单的角度看问题。现在,这个架构有效,但你说得对,也许我应该尝试从简单的流星方式走出去。我想看看其他人对Meteor和Javascript的灵活性所做的工作 – ncubica 2014-10-22 18:55:50