假设:Meteor.call()是否尝试首先在客户端环境中运行?

时间:2013-12-05 09:54:00

标签: javascript meteor

由于this question试验了Meteor,我得出以下结论:

在共享目录(客户端/服务器)中定义,这将引发引用错误

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使用第一种方法尝试在客户端上没有明确限制服务器时运行代码。真的吗?!还有什么可以解释?

3 个答案:

答案 0 :(得分:1)

不要使用Meteor.isServer()

  

Meteor.isServer可用于限制代码运行的位置,但事实并非如此   防止代码被发送到客户端。

check this answer构建您的流星应用

答案 1 :(得分:0)

好的,我明白了。使用第一种方法,Meteor抛出ReferenceError。这是由于客户端模拟了该功能。文档here中描述了此功能。

因此代码适用于这两种方法,但是当也在客户端上定义时,它会抛出ReferenceError。将范围限制在服务器时,不会再发生这种情况。

答案 2 :(得分:0)

我想你可能只需要一个var serverVar;在最顶层(共享)