在服务器上设置要在另一个函数中使用的变量

时间:2015-02-19 17:52:07

标签: node.js meteor global-variables iron-router

我正在寻找一种有效的方法来实现我的事件流程。到目前为止,这正是我要做的事情:

我的对象是Meteor.call(...function, (error, result))的结果 我在客户端myObject = result上声明了该对象。当用户单击按钮

时,会发出此调用

现在,我如何将此变量放入我现在在Router.route(Iron路由器)中进行的另一个流星调用?截至目前,它尚未定义。

此对象中的值已在函数内的服务器上定义。我实际上是将此对象从服务器传递到客户端,然后再次返回服务器。 我可以将它存储在服务器上以用于其他功能吗?

我读到,在服务器上存储全局变量时,如果为其他用户设置了这些变量的值,就会搞乱其他用户。这是对的吗?

e.g。下一个调用,但myObject未定义

Router.route('/home/', {
name: 'home',
waitOn: function () {
 },
action: function () {
// putting 'myObject' into call to pass onto the server
    Meteor.call('toUseTheObjectOnServer', myObject, function (error, response) {
        if (error) {
            console.log(error)
        } else {
            console.log(response)
        }
    })
    }
 if (this.ready())
 this.render('home');
 else
 this.render('Loading');
}
});

我要实现的事件流程:

  1. (服务器)http post - 我在体内返回了2个字段(token,token_secret)。 callback将结果返回给客户端

  2. (客户端)我使用其中一个字段'令牌'构造一个url并在我得到结果后立即将用户引导到此。用户登录外部应用程序,有效地授予我访问其数据的权限。

  3. 如果用户授予我访问权限,则会将用户定向到我提供给服务提供商的回调网址。服务提供者向该回调URL添加一个参数,该参数指示用户是否授予我访问权限。回调网址中的参数是authorize=1 ...这意味着我已被授予。 authorize=0 ...我没有被授予访问权限。

    1. (服务器)如​​果我被授予访问权限,那么我需要使用来自步骤1的令牌和token_secret值在服务器上进行另一次http调用。这些值现在已被授权'值。身体的反应是“访问权利”。我存储在我的数据库中,以便为我想要的任何数据进行授权api调用。

1 个答案:

答案 0 :(得分:1)

为了在文件之间使用它(在模板上设置,在路由器中使用),您需要将其存储在某种全局状态中。在这个例子中,我将使用一个会话变量:

Template.myTemplate.events({
  'click button': function() {
    Meteor.call('methodToGetObject', function(err, response) {
      Session.set('myGlobalObject', response);
    });
  }
});

Router.route('/home', {
  action: function() {
    var object = Session.get('myGlobalObject');
    Meteor.call('toUseTheObjectOnServer', object, function(err, response) {
      console.log(response);
    });
  }
});

可以将值存储在服务器上的每个用户的内存中,但这有两个原因并不理想:

  • 如果服务器重新启动,您将失去所有用户的状态。
  • 如果您缩放经过单个服务器,则无效。

更强大的解决方案是将状态存储在数据库中,并为每个连接的客户端自动发布它。如果用户在重新连接后应自动接收对象,则此方法可能有意义。如果第一个解决方案不适合您,我们可以更多地探索这个想法。