Meteor.Methods在一个函数中,可能的架构解决方案
所以我喜欢使用匿名函数进行编码,而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
您可以替换此:
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周围关闭。
这是更好,我有什么。好的解决方案和不错的提示 – ncubica 2014-10-22 00:21:29
我现在看到它的那个page.add不是一个命名空间的唯一问题,对吧?如果你有例如'myapp2.page =()'你现在不能使用'page.add',或者我错了吗? – ncubica 2014-10-22 00:23:58
方法定义的位置并不重要。整个Meteor项目是一个“应用程序”。如果您希望对范围进行非常详细的控制,您可能希望将代码放入一个包中,但我会注意不要过度优化模块化。您也可以从服务器调用Meteor方法,因此可以从应用程序,客户端或服务器的任何位置访问“page.add”。 – stubailo 2014-10-22 03:16:47
你在做什么混淆了Meteor努力做的事情:让开发人员更简单。流星给你最简单,最直接的方式来完成自从我在C初期就已经见过的事情。你只需编写干净的代码来做你想做的事。流星使用网络应用程序来做到这一点,这是一件非常美丽的事情。底线:如果您在Meteor代码中添加间接层,您可能会过度解决问题。放轻松。 :-)将客户端的东西保存在客户端/服务器中的服务器/以及其外部的共享内容。享受简单。
好吧我会尝试从简单的角度看问题。现在,这个架构有效,但你说得对,也许我应该尝试从简单的流星方式走出去。我想看看其他人对Meteor和Javascript的灵活性所做的工作 – ncubica 2014-10-22 18:55:50
你知道你可以多次调用Meteor.methods吗?所以你可以用'Meteor.methods({“pages.add”:function(){.... something ...}});' – stubailo 2014-10-21 23:40:42
复制上面的'我没有,这就是为什么我问。 – ncubica 2014-10-21 23:48:18
但仍然需要为每个函数声明Meteor.Methods中的方法。它不仅仅是一次呼吁在客户端统治他们。 – ncubica 2014-10-21 23:49:57