假设:Meteor.call()首先尝试在客户端环境中运行,这是真的吗

Assumption: Is it true that Meteor.call() tries to run in the client environment first?

本文关键字:环境 客户端 运行 是真的吗 call Meteor 假设      更新时间:2024-03-13

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子句。

我认为这两种方法应该是等效的,忽略了代码是可见的这一事实当仅受CCD_ 2限制时。

这让我得出这样的结论:Meteor使用第一种方法,当客户端不明确限制在服务器上时,它会尝试在客户端上运行代码。这是真的吗?!另一种解释是什么?

不要使用Meteor.isServer()

Meteor.isServer可以用来限制代码运行的位置,但它不能阻止代码发送到客户端。

检查这个答案来构建你的流星应用

好的,我明白了。使用第一种方法,Meteor抛出一个ReferenceError。这是由于该函数的客户端模拟。此处的文档中介绍了此功能。

因此,代码可以同时使用这两种方法,但当在客户端上定义时,它会抛出ReferenceError。当将作用域限制到服务器时,这种情况将不再发生。

我认为您可能只需要一个var serverVar;在最顶部(共享)