【问题标题】:How can I access server-side variables via Meteor.call()?如何通过 Meteor.call() 访问服务器端变量?
【发布时间】:2013-12-21 15:58:19
【问题描述】:

我认为在 Meteor 中定义存储系统信息的服务器端类会很聪明。此信息应由选定的用户访问。它不存储在 MongoDB 中,因此据我了解,我认为订阅和发布不是一种选择。

这是我的简化方法:

if(Meteor.isServer) {
    serverVar = true; // could depend on server logic
}    

Meteor.methods({
    myMethod: function() {
        if(serverVar) {
            return "secret";
        } else {
            throw Error();
        }
    }
}

然后,在客户端:

Meteor.call("myMethod", function(err, res) {
    console.log(res);
}

不幸的是,我得到了一个 ReferenceError ,其中 serverVar 没有定义。在我看来,在定义serverVar 时使用Meteor.isServer 作为条件打破了这个概念。但是如何使用Meteor.methods 访问服务器端变量?什么样的方法可以解决我的问题?非常感谢!

更新:感谢您的建议。 serverVar 可以是服务器上定义的任何内容,而不是 Meteor.isServer。因此,我认为仅将客户端上的 serverVar 定义为 false 并不能解决我的问题。

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:
    var serverVar = false; // Pre-define serverVar
    if(Meteor.isServer) {
       serverVar = true; // could depend on server logic
    }    
    
    Meteor.methods({
    myMethod: function() {
        if(serverVar) {
            return "secret";
        } else {
            throw Error();
        }
     }
    }
    

    甚至

    var serverVar = Meteor.isServer; 
    

    【讨论】:

    • 这会不会导致在客户端定义serverVar 并且错误不再出现的情况,但它也不会是真的。我想要的是从客户端调用一个方法并访问服务器变量。我以为这就是Meteor.call的概念——我可以访问和执行服务器端的函数和变量。我的serverVar只是一个例子,不是Meteor.isServer的代表。
    【解决方案2】:

    注意这一点。如果您计划构建可扩展的应用程序,这可能是个问题。如果您的变量是看起来是的非用户变量。如果您将该变量设置为 true 并拥有其他服务器,则不会影响其他服务器。

    另一个问题是如果服务器崩溃/重新启动状态被重置

    您可以将变量存储在一个集合中,这样做可能会更好。这没有什么问题。

    【讨论】:

    • 感谢您指出这一点。在这种特殊情况下,我只是试图将对方法的访问限制在某些情况下,比如只能通过 node.js 访问的时间方法,因此只能通过服务器端功能。用户可以在客户端操作时间,但不能在服务器上操作。收藏在那里没有多大意义。
    猜你喜欢
    • 2017-04-22
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多