Meteor.Methods在一个功能,可能的架构解决方案

时间:2014-10-21 23:31:29

标签: javascript architecture meteor

所以我喜欢使用匿名函数进行编码,Meteor.methods为我打破了这一点。所以我创建了一个像这样的Meteor.Methods

// SERVER SIDE

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

// CLIENT SIDE

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

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

// SERVER SIDE

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

现在我的应用程序更像是模块化的,可以在不同的文件中拆分非常简单,并创建你想要的任何命名空间。

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

感谢

2 个答案:

答案 0 :(得分: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周围进行闭包。

答案 1 :(得分:1)

你正在做的是混淆Meteor努力工作的事情:让开发人员更简单。 Meteor为您提供了最简单,最直接的方式来完成我自C早期以来所看到的事情。您只需编写干净的代码来做您想做的事情。 Meteor通过网络应用程序实现这一点,这是一件非常美好的事情。

底线:如果您在Meteor代码中添加间接层,则可能会过度思考问题。放轻松。 :-)将客户端内容保存在client /,服务器中的服务器内容以及它们之外的共享内容。享受简约。