Наличие огненной базы становится все более и более неправильным со временем
У меня есть простой счетчик присутствия, настроенный для firebase на основе их примера. Проблема в том, что он полагается на удаление отсчетов при отключении. Тем не менее, firebase, похоже, выключается каждые 2 месяца и удаляет обработчики ondisconnect. Это означает, что со временем счет становится все больше и больше неправильным. Есть ли способ это исправить?
ty.Presence = function() {
this.rooms = {}
this.presence = fb.child('presence')
this.connectedRef = fb.child('.info/connected');
if (!localStorage.fb_presence_id) {
localStorage.fb_presence_id = Math.random().toString(36).slice(2)
}
this.browserID = localStorage.fb_presence_id
var first = false
}
ty.Presence.prototype.add = function(roomID, userobj) {
var self = this
var userListRef = this.presence.child(roomID)
// Generate a reference to a new location for my user with push.
var obj = {
s: "on",
id: this.browserID
}
if (userobj) {
obj.u = {
_id: userobj._id,
n: userobj.username
}
if (userobj.a) {
obj.u.a = userobj.a
}
}
var myUserRef = userListRef.push(obj)
this.rooms[roomID] = myUserRef
this.connectedRef.on("value", function(isOnline) {
if (isOnline.val()) {
// If we lose our internet connection, we want ourselves removed from the list.
myUserRef.onDisconnect().remove();
}
});
};
ty.Presence.prototype.count = function(roomID, cb) {
var self = this
var userListRef = this.presence.child(roomID)
var count = 0
function res () {
var usersArr = _.pluck(users, 'id')
usersArr = _.uniq(usersArr)
count = usersArr.length
if (cb) cb(count)
}
var users = {}
userListRef.on("child_added", function(css) {
users[css.name()] = css.val();
res()
});
userListRef.on("child_removed", function(css) {
delete users[css.name()]
res()
});
cb(count)
};
ty.Presence.prototype.get = function(ref) {
return this[ref]
};
ty.Presence.prototype.setGlobal = function(object) {
var self = this
_.each(this.rooms, function (myUserRef) {
myUserRef.set(object)
})
};
ty.Presence.prototype.remove = function(roomID) {
if (this.rooms[roomID])
this.rooms[roomID].remove();
};
ty.Presence.prototype.off = function(roomID) {
var userListRef = this.presence.child(roomID)
userListRef.off()
};
ty.presence = new ty.Presence()
ty.presence.add('all')
1 ответ
Обработчики onDisconnect могут быть потеряны при перезапуске Firebase (например, при запуске новой версии). Один из простых подходов - прикрепить временную метку в качестве приоритета к записям, когда они хранятся. Пока клиент остается в сети, время от времени обновляйте его метку.
setInterval(function() {
connectedRef.setPriority(Date.now());
}, 1000*60*60*4 /* every 4 hours */ );
Таким образом, любая запись, которая достигает, скажем, 24 часов, очевидно, будет сиротой. Проблема может иметь место у клиентов (например, когда новый клиент получает список в первый раз) или с помощью процесса сервера (например, сценарий node.js с setInterval() для проверки записей старше X).
presenceRef.endAt(Date.now()-24*60*60*1000 /* 24 hours ago */).remove();
Конечно, не идеально, но это функциональный обходной путь, который я использовал в приложениях.