我正在寻找一种有效的方法来实现我的事件流。到目前为止,这就是我要做的:
我有一个对象,它是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');
}
});
我要实现的事件流:
(服务器)http-post-我在主体中返回了2个字段(token,token_secret)。回调将结果返回给客户端
(客户端)我使用其中一个字段"token"来构建一个url,并在得到结果后立即将用户引导到该url。用户登录外部应用程序,有效地允许我访问他们的数据。
如果用户授予我访问权限,则会将用户定向到我提供给服务提供商的回调url。服务提供商向这个回调url添加了一个参数,该参数指示用户是否授予我访问权限。回调url中的参数是authorize=1
。。。这意味着我已经被批准了。authorize=0
。。。我没有被授予访问权限。
- (服务器)如果我被授予了访问权限,那么我需要使用步骤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);
});
}
});
可以将服务器上每个用户的值存储在内存中,但这并不理想,原因有两个:
- 如果服务器重新启动,您将失去所有用户的状态
- 如果您扩展到超过一台服务器,这将不起作用
一个更健壮的解决方案是将状态存储在数据库中,并为每个连接的客户端自动发布。如果用户应该在重新连接后自动接收对象,则这种方法可能是有意义的。如果第一个解决方案对您不起作用,我们可以进一步探索这个想法。