2014-09-03 50 views
1

我讀了很多關於快遞/ 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); 

    }); 

好消息:基本上,它的工作原理。

壞消息:每次刷新頁面,聽衆自己加倍,因爲他們在頁面加載調用的循環中。

以下,這應該是一條線:

enter image description here

所以我應該把所有的socket.on(「連接」 ......)的頁面加載之外的東西,這意味着當服務器開始......是的,但我也需要req/res數據庫才能加載庫,我只有在加載頁面時才能獲得這些庫!

這是一個編程邏輯問題,我知道我做錯了什麼,但我現在不知道該走到哪裏,我得到了這個「基本上」工作的大系統,但是我做這件事的方式有一個悖論。無法弄清楚如何解決這個問題......我被卡住了幾個小時。

我該如何反思,以便在socket.on()調用中根據req/res獲取當前庫的可能性?有沒有一招?我應該考慮徹底改變自己的方式嗎?

此外,有另一種方式做我想做的事?

謝謝大家!

注:如果我沒有解釋好,或者如果你想要更多的代碼,只是告訴我:)

編輯 - 解決方案:就像上面我們可以使用sockets.once();而不是sockets.on(),或者還有sockets.removeAllListeners()解決方案,它不那麼幹淨。

回答

3

請嘗試以下。

io.sockets.once('connection', function(socket) { 
    io.sockets.emit('new-data', { 
    channel: 'stdout', 
    value: data 
}); 
}); 

使用一次而不是on。

此問題與以下鏈接中給出的類似。

https://stackoverflow.com/questions/25601064/multiple-socket-io-connections-on-page-refresh/25601075#25601075

+0

您的解決方案就像一個魅力!我也有一個sockets.removeAllListeners()的解決方案;這會重置聽衆,但您的方式肯定會更好! – Laurent 2014-09-03 19:25:58

+0

這很好,現在我們有這個問題的兩個解決方案:) – 2014-09-04 07:35:50