2012-12-06 132 views
4

我是Node.js和Express的noob :(我有一個訪問其他模塊中的socket.io對象的問題我創建了一個全局變量來但是隻要用戶關閉連接,連接不再可用,技術上我猜連接仍然存在,但是我因爲資源原因將其刪除。Node.js - Socket.io - Express 3

注意以下每次連接都建立該套接字分配給全局變量這是所有其他模塊訪問。

// App.js 
var io = require('socket.io').listen(server); 
var sessionsConnections = {}; 

io.sockets.on('connection', function (socket) 
{ 
    global.socket = socket; 
    sessionsConnections[socket.id] = socket; 
    ..... 
} 

socket.on("disconnect", function() 
{ 
    delete sessionsConnections[socket.id]; 
}); 

// Match.js 
    global.socket.emit('lobby:createMatch', data); 

如果最後分配給全局的連接關閉Match.js將被擰緊。此時,Match.js是唯一需要socket.io引用的模塊。 Match.js有一堆用於處理事件的輸出,發佈更改並呈現視圖。

是否有任何建議如何處理?爲了成爲全局引用,是否可以實例化一個初始的套接字連接來存在於App.js中?

+0

您是否正在嘗試僅處理一個連接? 你在發射之前測試global.socket的值嗎? 你得到的錯誤是什麼? –

+0

用戶始終創建並連接到匹配項。事情是這個設計的作品,但它並不完全證明。當我測試並連接套接字時,將其分配給全局,斷開連接並終止套接字,然後嘗試發出它掛起的global.socket,最後我得到一個錯誤,說找不到套接字或其他東西。 –

+0

好吧,我認爲你沒有得到這樣的事實:'socket'不是唯一的,而是每個用戶都不相同。 lortabac的答案將幫助你;) –

回答

4

io.sockets.on('connection', function(socket) {...})中的socket變量對於每個連接都不相同。

因爲在你的代碼global.socket始終是相對於上次連接的客戶端套接字的參考,這是正常的,如果這種客戶端斷開連接,該插座就會死亡。

在任何情況下,我看不出有任何理由使用全局變量。如果您需要將消息發送給特定的客戶端,您可以使用socket變量連接回調中:

io.sockets.on('connection', function (socket) 
{ 
    socket.emit('foo', 'bar'); 
} 

如果需要訪問另一個模塊的插槽,你可以導出sessionsConnections對象,並訪問你需要通過它的ID插座:

//In app.js 
exports.connections = sessionsConnections; 

//In match.js 
var app = require('./app.js'); 
app.connections[clientId].emit('foo', 'bar'); 

當然,你需要跟蹤id的地方。

+0

這就是爲什麼我問Charles是否只有一個客戶端可以連接。我想他不明白事實上每個連接都有獨特的套接字。好的答案;) –

+0

我確實知道每個插座每個連接都是唯一的。我試圖做的是警告其他連接的用戶userA已斷開連接。如果userA與全局綁定(因爲他是最後一個連接),顯然這些發射不起作用。如果客戶ID未被刪除,Lortabac的解決方案可以工作。記住用戶斷開連接,並且他們的套接字連接不再可用於發出。我可以從sessionsConnections對象訪問另一個clientID。 –

0

你可以嘗試express.io

http://express-io.org/

npm install express.io 

它的工作原理相同,快遞,除了它具有socket.io整合內置。它也有基本的路由,所以處理你的問題要容易一些。

看看這個簡單的例子:

app = require('express.io')() 
app.http().io() 

app.io.route('some-event', function(req) { 
    req.io.broadcast('announce', 'someone triggered some-event') 
}) 

app.listen(7076) 

您也可以使用對象的路由,這使得它更像是一個傳統的控制器:

app = require('express.io')() 
app.http().io() 

app.io.route('posts', { 
    create: function(req) { 
     // create a post 
    }, 
    remove: function(req) { 
     // remove a post 
    } 
}) 

app.listen(7076) 

希望幫助!

+0

哦,是的,會議自動工作!只需將它們設置爲正常,並且它們也將被安裝到io請求中。 –