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



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

我有一个对象,它是Meteor.call(...function, (error, result))的结果我在我的客户端myObject = result上声明该对象当用户单击按钮时发生此调用

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

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

我读到,当其他用户为全局变量设置值时,在服务器上存储全局变量可能会给他们带来麻烦。这是正确的吗?

例如,下一个调用,但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)。回调将结果返回给客户端

  2. (客户端)我使用其中一个字段"token"来构建一个url,并在得到结果后立即将用户引导到该url。用户登录外部应用程序,有效地允许我访问他们的数据。

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

  1. (服务器)如果我被授予了访问权限,那么我需要使用步骤1中的token和token_secret值在服务器上进行另一个http调用。现在是"授权"值。正文中的响应是我存储在数据库中的"访问令牌",以便对我想要的任何数据进行授权的api调用

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

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);
    });
  }
});

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

  • 如果服务器重新启动,您将失去所有用户的状态
  • 如果您扩展到超过一台服务器,这将不起作用

一个更健壮的解决方案是将状态存储在数据库中,并为每个连接的客户端自动发布。如果用户应该在重新连接后自动接收对象,则这种方法可能是有意义的。如果第一个解决方案对您不起作用,我们可以进一步探索这个想法。

相关内容

  • 没有找到相关文章

最新更新