在最新的 Meteor 版本(版本 0.5.8)中,Session
已从服务器端代码中删除。
以前我曾经为服务器Session
存储特定于客户端的变量;这个功能的替代品是什么?
示例案例:User One
打开浏览器,User Two
打开浏览器。一个调用服务器上的方法设置一些令牌,另一个调用服务器上的方法做同样的事情。然后,当客户端请求某些内容时,我需要访问它。我如何区分两者?
您需要将令牌保存到数据库中的集合中。
如果您Session
想简单地将session
包复制到应用程序的packages
目录并更改其 package.js 以在服务器上加载,则可以在服务器上使用。但是 Session 是一种内存数据结构,因此如果您有多个服务器实例,它将无法工作;并且您将无法在不丢失用户令牌的情况下重新启动服务器。
如果您将令牌存储在数据库中,它们将在服务器重新启动时保持不变,并将与未来版本的 Meteor 一起使用,该版本能够通过在需要时添加更多服务器实例来扩展应用程序。
如果您需要使令牌过期(这样您的集合就不会无限制地增长),您可以在令牌集合中添加一个“lastUsed”日期字段,并定期删除未使用超过您选择的到期时间的令牌时期。
您也可以使用每个选项卡独有的会话 ID。不太确定如何获取当前会话 id,但它应该在某个地方(你可以在 中看到它Meteor.default_server.sessions
,所以还有一种方法:
客户端js
Meteor.call("test", Meteor.default_connection._lastSessionId, function(err,result) {
console.log(result);
});
服务器端Js
Session = {
set : function(key, value, sessionid) {
console.log(Meteor.default_server.sessions[sessionid]);
if(!Meteor.default_server.sessions[sessionid].session_hash) Meteor.default_server.sessions[sessionid].session_hash = {};
Meteor.default_server.sessions[sessionid].session_hash.key = value;
},
get : function(key, sessionid) {
if(Meteor.default_server.sessions[sessionid].session_hash)
return Meteor.default_server.sessions[sessionid].session_hash.key;
},
equals: function(key, value, sessionid) {
return (this.get(key, sessionid) == value)
},
listAllSessionids: function() {
return _.pluck(Meteor.default_server.sessions, "id");
}
};
Meteor.methods({
test:function(sessionid) {
if(!Session.get("initial_load", sessionid)) Session.set("initial_load", new Date().getTime(), sessionid);
return Session.get("initial_load", sessionid);
}
});
我挂钩Meteor.default_connection._sessions
以存储这些值,以便在会话不再有效时(即用户已关闭他的选项卡)涉及某种类型的垃圾收集,以防止浪费内存。在livedata_server.js
这些旧会话中,DDP 线上 1 分钟没有活动(如心跳)后被销毁。
因为服务器可以看到每个人的会话,您可以使用sessionid
访问另一个用户的会话数据。并listAllSessionids
给出当前活动的所有 sessionid 的数组。
在方法中自动设置像 this.userId 这样的会话,而不在调用中使用参数
看起来有这个功能,但它没有完全连接起来。会话 id 将被存储,this.sessionData
但它可能仍未完成。它在那里被调用,method
但它还没有被设置(在livedata_connection.js
&中livedata_server.js
)