2017-06-14 81 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即可检索套接字。