2017-06-14 84 views
0

我使用Express4和指向路徑/的路由器,並且該文件由名爲chat.js的JS文件處理。每當有新的連接時,Socket.io連接不斷增加

我的IO對象已經綁定到app.io,所以我chat.js裏面我會用req.app.io叫我Socket.IO,但問題是,我用它來使用socket.emit和代碼只是正常工作,但現在如果我想與客戶端同步,則必須使用req.app.io.emit

而由於我使用req.app.io.emit,我有連接不斷增加的問題。


index.js

const express = require('express'); 
const app = express(); 
const http = require('http'); 
const server = http.createServer(app); 
const path = require('path'); 
const randomstring = require('randomstring'); 
const sha256 = require('sha256'); 
const io = require('socket.io').listen(server); 
app.io = io; 
const port = process.env.PORT || 3000; 

module.exports.users = {}; 

server.listen(port,() => { 
    console.log(`Serer is running on port ${port}`); 
}); 

app.set('view engine', 'ejs'); 
app.set('views', path.join(`${__dirname}/../public`)); 
app.use('/static', express.static(path.join(`${__dirname}/../public`))); 


app.use('/', require('./chat')); 

chat.js

const express = require('express'); 
const router = express.Router(); 
const users = require('./index').users; 
const randomstring = require('randomstring'); 
router.get('/', (req, res) => { 
    res.render('index'); 
    const uid = randomstring.generate(30); 
    users[uid] = true; 
    req.app.io.on('connection', socket => { 
     console.log('hello'); 

     socket.on('disconnect',() => { 
      console.log('bye'); 
     }); 

    }); 
}); 

module.exports = router; 

日誌(圖片)

Serer is running on port 3000 
hello 
bye 
hello 
hello 
bye 
bye 
+0

您預期會發生什麼?該控制檯輸出表明連接,斷開,連接,連接,斷開和斷開 - 爲什麼這是錯的? –

+0

正如您所看到的,我第一次連接到我的服務器時,它會一次性註銷'hello'和'bye',並且第二次連接到我的服務器時,它會註銷'hello'和'bye'兩次 –

+1

哦,因爲對於每個'.get('/''你正在添加另一個'req.app.io.on('connection',' –

回答

1

每次您的/路線被擊中時,您都會創建一個新的重複io.on('connection', ...)事件處理程序。所以,在該路線被擊中3次之後,您有3個事件處理程序用於connection事件。所以,當它發生時,你的代碼被調用3次。

相反,您應該只在路線外做io.on('connection', ...)一次。


僅供參考,你似乎沒有被做任何事情與uid你正在創建有用的,因爲你不與任何特定連接相關聯。僅供參考,每個socket.io連接已經有一個獨特的socket.id,它與每個socket.io連接唯一關聯,以便您可以從套接字獲取該id,或者只需提供該id即可檢索套接字。