Javascript 假设:Meteor.call()是否首先尝试在客户端环境中运行?
通过对流星的实验,我得出以下结论: 在共享目录(客户端/服务器)中定义,这将引发引用错误:Javascript 假设:Meteor.call()是否首先尝试在客户端环境中运行?,javascript,meteor,Javascript,Meteor,通过对流星的实验,我得出以下结论: 在共享目录(客户端/服务器)中定义,这将引发引用错误: if(Meteor.isServer) { // could depend on server logic, this is not Meteor.isServer! serverVar = true; } Meteor.methods({ myMethod: function() { if(serverVar) { return
if(Meteor.isServer) {
// could depend on server logic, this is not Meteor.isServer!
serverVar = true;
}
Meteor.methods({
myMethod: function() {
if(serverVar) {
return "secret";
} else {
throw Error();
}
}
}
然后,在客户机上:
Meteor.call("myMethod", function(err, res) {
console.log(res);
}
导致:ReferenceError:serverVar
但这段代码仅在服务器端定义,可以完美地运行:
// could depend on server logic, this is not Meteor.isServer!
serverVar = true;
Meteor.methods({
myMethod: function() {
if(serverVar) {
return "secret";
} else {
throw Error();
}
}
}
注意,我只切换到服务器端目录而不是共享目录,并删除了if子句
我认为这两种方法应该是等效的,忽略了代码是可见的这一事实
仅受Meteor.isServer的限制时在客户端上运行
这使我得出结论,Meteor使用第一种方法,试图在客户端上运行代码,而不是显式地限制在服务器上。这是真的吗?!还有什么解释呢?好的,我明白了。使用第一种方法,Meteor抛出一个
ReferenceError
。这是由于客户端对函数进行了模拟。文档中介绍了此功能
因此,代码可以同时使用这两种方法,但在客户端上定义代码时,它会抛出ReferenceError
。当将作用域限制在服务器上时,这种情况不再发生。不要使用Meteor.isServer()
可以使用Meteor.isServer限制代码运行的位置,但它不能
防止将代码发送到客户端
要构建meteor应用程序我想您可能只需要一个var serverVar;在最顶端(共享)