2012-04-21 85 views
20

有沒有一種方式,當客戶端從服務器流星斷開檢測,或者通過刷新或從頁面導航離開,從而使服務器可以嘗試一些清理工作?服務器斷開清理

回答

18

一種技術是實現「保活」的方法,每個客戶端調用定期。這假定你有一個user_id在每個客戶的Session舉行。

// server code: heartbeat method 
Meteor.methods({ 
    keepalive: function (user_id) { 
    if (!Connections.findOne(user_id)) 
     Connections.insert({user_id: user_id}); 

    Connections.update(user_id, {$set: {last_seen: (new Date()).getTime()}}); 
    } 
}); 

// server code: clean up dead clients after 60 seconds 
Meteor.setInterval(function() { 
    var now = (new Date()).getTime(); 
    Connections.find({last_seen: {$lt: (now - 60 * 1000)}}).forEach(function (user) { 
    // do something here for each idle user 
    }); 
}); 

// client code: ping heartbeat every 5 seconds 
Meteor.setInterval(function() { 
    Meteor.call('keepalive', Session.get('user_id')); 
}, 5000); 
+0

經過多次搜索,我認爲這是現在的最佳解決方案。謝謝!! – greggreg 2012-04-24 05:38:19

+6

這幾乎是僞代碼,因爲它不起作用:第一個setInterval沒有指定間隔。 Connections.update命令也沒有指定更新{'user_id':user_id}。可能還有其他錯誤。不過這是一個好的開始。 – 2012-09-08 16:53:05

+3

@debergalis這仍然是推薦的方式,看看客戶是否已經死了? – user2602152 2014-01-19 12:46:09

1

如果您使用的是Auth,您可以在Method and Publish函數中訪問用戶的ID,那麼您可以在那裏實現您的跟蹤。當用戶切換房間時,你可以設置「最後看到」:

Meteor.publish("messages", function(roomId) { 
    // assuming ActiveConnections is where you're tracking user connection activity 
    ActiveConnections.update({ userId: this.userId() }, { 
     $set:{ lastSeen: new Date().getTime() } 
    }); 
    return Messages.find({ roomId: roomId}); 
}); 
13

我認爲更好的方法是捕獲發佈函數中的套接字關閉事件。

Meteor.publish("your_collection", function() { 
    this.session.socket.on("close", function() { /*do your thing*/}); 
} 

UPDATE:

更新的版本流星的使用_session這樣的:

this._session.socket.on("close", function() { /*do your thing*/}); 
+0

太棒了。但後來我顯然遇到這個問題:http://stackoverflow.com/questions/10192938/meteor-code-must-always-run-within-a-fiber-when-calling-collection-insert-on-s – huyz 2012-09-28 08:53:23

+0

謝謝。這是回答我的問題:[流星觀摩運行下去(http://stackoverflow.com/q/12902392/599991) – zVictor 2012-10-16 17:29:40

+3

我用流星0.6.1和此行'this.session.socket.on(」關閉「,函數(){/ *做你的事* /});'我的服務器返回_TypeError:無法讀取undefined_的屬性'套接字'但是當我糾正它'this._session.socket.on(」close「,函數(){/ *做你的事情* /});'它工作得很好,謝謝 – fantom 2013-04-13 18:04:26

2

我已經實現了一個流星智能包,跟蹤從不同會話的所有連接的會話,並檢測這兩個會話註銷並斷開事件,而不需要昂貴的Keepalive。

https://github.com/mizzao/meteor-user-status

爲了檢測斷開/註銷事件,你可以做到以下幾點:

UserStatus.on "connectionLogout", (info) -> 
    console.log(info.userId + " with session " + info.connectionId + " logged out") 

你也可以用它被動。一探究竟!

編輯:v0.3.0用戶狀態現在跟蹤用戶空閒以及!

+0

這可以在每個頁面的基礎上完成,而不是通過整個應用程序? – Scalahansolo 2014-06-26 15:56:26

+0

是的,雖然這還沒有實施。打開功能請求! – 2014-06-26 15:57:33

-1

我使用Iron Router,並呼籲unload事件我的主控制器我清理代碼。當然,這不會趕上標籤關閉的事件,但仍然感覺很好用於許多用例

ApplicationController = RouteController.extend({ 
    layoutTemplate: 'root', 
    data: {}, 
    fastRender: true, 
    onBeforeAction: function() { 
     this.next(); 
    }, 
    unload: function() { 
     if(Meteor.userId()) 
      Meteor.call('CleanUpTheUsersTrash'); 
    }, 
    action: function() { 
     console.log('this should be overridden by our actual controllers!'); 
    } 
});