2014-10-21 59 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