我正在构建一个控件,其中存在视觉反馈,因为服务器会响应来自客户端的输入。
控件将同时在多个客户端上可见,我希望对控件进行更改的客户端对所有其他客户端的反馈略有不同,这些反馈会看到有关状态更改的信息较少。
是否有流星内置功能来唯一标识我可以用于此的每个客户端?如果没有,我怎么能去做一个不可否认的标识符呢?它需要在同一浏览器中识别两个不同的客户端中的两个不同选项卡。
答案 0 :(得分:1)
我无法找到任何简单的方法来构建Meteor,但您可以根据具体用例进行尝试。
这是一种跟踪每个浏览器窗口或选项卡的唯一客户端连接的技术。下面的每个connectionId都可以被认为是聊天室。由于Meteor方法中的this.connection.id
属性在每个打开的窗口或选项卡中不是唯一的,因此这将在集合中存储连接ID以及时间戳。当客户端关闭浏览器选项卡或窗口时,您可以使用服务器方法this.connection.onClose
内的回调来通过其ID和时间戳查找该特定连接,并将其标记为关闭或脱机。
Fiber = Npm.require('fibers');
Future = Npm.require('fibers/future');
Meteor.methods({
'client.disconnect': function(connectionId){
check(connectionId, String);
let query = {_id: connectionId};
let options = {$set: {isOnline: false}};
return Connections.update(query, options);
},
'client.connect': function(connectionId){
check(connectionId, String);
let lastSessionTime = Number(new Date().getTime());
let lastSessionId = this.connection.id;
let offlineQuery = {
_id: connectionId,
lastSessionTime: lastSessionTime,
lastSessionId: lastSessionId
}
let offlineOptions = {
$set: {isOnline: false}
}
// When the connection closes, turn this connection offline.
this.connection.onClose(function(){
// You could also remove the document.
Connections.update(offlineQuery, offlineOptions);
});
let onlineQuery = {
_id: connectionId
}
let onlineOptions = {
$set: {
lastSessionTime: lastSessionTime,
lastSessionId: lastSessionId,
isOnline: true}
}
var future = new Future();
Connections.upsert(onlineQuery, onlineOptions, function(err, res){
if (err){
future.throw('Connections.online error');
}else{
future.return(res);
}
});
}
});