【问题标题】:Meteor.Methods in one function, possible architecture solutionMeteor.Methods 在一个功能中,可能的架构解决方案
【发布时间】:2014-12-17 08:26:14
【问题描述】:

所以我喜欢使用匿名函数进行编码,而 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
        }
    })();

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

我是否违反了 METEOR 规则?这不安全吗?这是个坏主意?欢迎任何建议,我还是 Meteor 的新手。

谢谢

【问题讨论】:

  • 您知道您可以多次拨打Meteor.methods 吗?因此,您可以使用Meteor.methods({"pages.add": function () {.... something ....}}); 复制上述内容
  • 不,我没有,这就是我问的原因。
  • 但是您仍然应该在 Meteor.Methods 中为每个函数声明方法。它不仅仅是一个要求在客户端将它们全部统治的呼吁。
  • 一次调用而不是直接命名方法有什么好处?
  • 我认为任何架构都可以工作,包括您的架构,但以前使用过 Meteor 的人可能希望看到客户端调用的每个函数的显式方法。这有点像为您的 REST API 声明路由 - 它可以让您轻松查看客户端可以访问和不可以访问的内容。

标签: javascript architecture meteor


【解决方案1】:

你可以替换这个:

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 进行闭包。

【讨论】:

  • 这比我拥有的要好得多。很好的解决方案和不错的提示。
  • 我现在看到的唯一问题是那个页面。添加它不是命名空间,对吗?如果你有例如myapp2.page = (),你现在不能使用page.add,还是我错了?
  • 方法在哪里定义无关紧要。整个 Meteor 项目是一个“应用程序”。如果您想要非常详细地控制范围,您可能希望将代码放入一个包中,但我会注意不要过度优化模块化。您还可以从服务器调用 Meteor 方法,因此可以从应用程序、客户端或服务器中的任何位置访问“page.add”。
【解决方案2】:

您所做的是混淆 Meteor 一直在努力做的事情:让开发人员的事情变得更简单。 Meteor 为您提供了完成工作的最简单、最直接的方法,这是我从 C 早期以来所见过的。您只需编写干净的代码来做您想做的事。 Meteor 用网络应用程序做到了这一点,这是一件非常漂亮的事情。

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

【讨论】:

  • 好的,我会尝试从一个简单的角度来看问题。现在,这种架构有效,但你是对的,也许我应该尝试从简单的流星方式开始。我想看看其他人对 Meteor 和 Javascript 的灵活性做了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
相关资源
最近更新 更多