Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 假设:Meteor.call()是否首先尝试在客户端环境中运行?_Javascript_Meteor - Fatal编程技术网

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;在最顶端(共享)