我讀了很多關於快遞/ SocketIO那簡直是瘋了,你怎麼很少得到比「你好」直接從app.js.傳輸其他一些例子問題是它在現實世界中並不像那樣工作......我實際上對一個似乎遠離網絡給我的邏輯問題感到絕望,這就是爲什麼我想指出這一點,我確信問問題將是解決方案! :)的NodeJS,SocketIO和Express Logic公司方面建立
我重構我的應用程序(因爲有像使用在全球範圍內把庫等許多錯誤);假設我有一個基於SocketIO和NodeJS的巨大系統。 app.js中有一個啓動套接字系統的加載器。
當有人加入它需要()另一個模塊的應用:它初始化許多socket.on(),它是動態加載和去一些/*_socket.js文件的文件夾。在這些模塊的每個功能表示套接字監聽,那麼它的方式更容易從前端調用它,可能是這樣的:
// Will call `user_socket.js` and method `try_to_signin(some params)`
Queries.emit_socket('user.try_to_signin', {some params});
系統本身的作品真的很好。但是有一個問題:將加載所有理解前端發送的文件的模塊也會傳送與req/res(會話,cookie,其他...)鏈接的庫,並且必須這樣做,因爲被調用的方法是應用程序的核心並且經常需要這些庫。
在前面的例子中,我們顯然需要檢查,如果用戶還沒有登錄項。
// The *_socket.js file looks like this :
var $h = require(__ROOT__ + '/api/helpers');
module.exports = function($s, $w) {
var user_process = require(__ROOT__ + '/api/processes/user_process')($s, $w);
return {
my_method_called: function(reference, params, callback) {
// Stuff using $s, $w, etc.
}
}
// And it's called this way :
// $s = services (a big object)
// $w = workers (a big object depending on $s)
// They are linked with the req/res from the page when they are instantiated
controller_instance = require('../sockets/'+ controller_name +'_socket')($s, $w);
// After some processes ...
socket_io.on(socket_listener, function (datas, callback) {
// Will call the correct function, etc.
$w.queries.handle_socket($w, controller_name, method_name, datas);
});
好消息:基本上,它的工作原理。
壞消息:每次刷新頁面,聽衆自己加倍,因爲他們在頁面加載調用的循環中。
以下,這應該是一條線:
所以我應該把所有的socket.on(「連接」 ......)的頁面加載之外的東西,這意味着當服務器開始......是的,但我也需要req/res數據庫才能加載庫,我只有在加載頁面時才能獲得這些庫!
這是一個編程邏輯問題,我知道我做錯了什麼,但我現在不知道該走到哪裏,我得到了這個「基本上」工作的大系統,但是我做這件事的方式有一個悖論。無法弄清楚如何解決這個問題......我被卡住了幾個小時。
我該如何反思,以便在socket.on()調用中根據req/res獲取當前庫的可能性?有沒有一招?我應該考慮徹底改變自己的方式嗎?
此外,有另一種方式做我想做的事?
謝謝大家!
注:如果我沒有解釋好,或者如果你想要更多的代碼,只是告訴我:)
編輯 - 解決方案:就像上面我們可以使用sockets.once();而不是sockets.on(),或者還有sockets.removeAllListeners()解決方案,它不那麼幹淨。
您的解決方案就像一個魅力!我也有一個sockets.removeAllListeners()的解決方案;這會重置聽衆,但您的方式肯定會更好! – Laurent 2014-09-03 19:25:58
這很好,現在我們有這個問題的兩個解決方案:) – 2014-09-04 07:35:50