2016-03-21 250 views
1

我遇到了用戶斷開socket.io並且實例保持活動狀態(包括所有事件偵聽器)的問題。斷開連接時銷燬socket.io連接

以下兩個示例都是由於數百行而導致的進度的部分代碼。但是這個問題仍然存在。

app.js例如:

var express = require('express'), 
    app = express(), 
    routes = require('./routes/index'), 
    server = require('http').createServer(app); 

io = require('socket.io').listen(server); 

app.engine('handlebars', exphbs({ defaultLayout: 'main' })); 
app.set('view engine', 'handlebars'); 

app.use('/', routes); 

server.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

module.exports = app; 

index.js路線例如:

var express = require('express'), 
    router = express.Router(); 

router.get('/', function(req, res) { 
    res.render('home', { 
     title: 'Home' 
    }); 

    setupSocket(req); 
}); 

function setupSocket(req) { 
    io.on('connection', function(socket) { 
     console.log('connected') 
    }); 
} 

module.exports = router; 

這將導致:

第一連接:

connected 

第二連接:

connected 
connected 

三方面:

connected 
connected 
connected 

等。這將繼續在頁面重新加載,新選項卡,新瀏覽器或其他任何其他內容,直到我重新啓動節點服務器。

在我的代碼中,我將數據從客戶端發佈到mongo數據庫,並且由於上述問題,請求會發布相同數據的多個副本。

所以問題是,如何防止實例在用戶離開頁面後保持活動狀態?

+0

可能重複:http://stackoverflow.com/questions/5048231/force-client-disconnect-from-server-with-socket-io-and-nodejs – Jer

+0

謝謝,不幸的是,這並沒有解決問題,我運行'socket.on('disconnect',function() {socket.disconnect();});'但是當我重新加載頁面時,它仍然保持堆疊'連接'在控制檯中 –

回答

1

正如你所說的在每個連接或刷新上你都得到了多個connected字符串輸出,這是因爲你在每個請求上附加了socket.io監聽器。這是你應該如何附上您的socket.io的connected聽衆:

var express = require('express'), 
    app = express(), 
    routes = require('./routes/index'), 
    server = require('http').createServer(app); 

io = require('socket.io').listen(server); 

app.engine('handlebars', exphbs({ defaultLayout: 'main' })); 
app.set('view engine', 'handlebars'); 

app.use('/', routes); 

// Your listener should be outside your routes 
io.on('connection', function(socket) { 
    console.log('connected') 
}); 

server.listen(3000, function() { 
    console.log('listening on *:3000'); 
}); 

module.exports = app; 

並在您的index.js只是刪除設置功能:

var express = require('express'), 
    router = express.Router(); 

router.get('/', function(req, res) { 
    res.render('home', { 
     title: 'Home' 
    }); 
}); 

module.exports = router; 
+0

那麼你將只在某個URL上打開套接字嗎? – Yomo710

+0

你爲什麼要這樣?您希望您的套接字服務器每次都運行 –

+0

我的套接字啓動了另一個功能,所以我只希望它在某個URL上註冊套接字連接。我把它放在URL請求塊的下面,但是和OP有同樣的問題。 – Yomo710