我正在使用带有指向路径/
的路由器的Express4,它由名为chat.js
的JS文件处理。
我的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 :(得分:1)
每次点击/
路由时,都会创建一个新的重复io.on('connection', ...)
事件处理程序。因此,在该路由被命中3次之后,您有{3}事件处理程序用于connection
事件。因此,当它发生时,你的代码会被调用3次。
相反,您应该只在路线外进行一次io.on('connection', ...)
。
仅供参考,您似乎没有对您正在创建的uid
做任何有用的事情,因为您不会将其与任何特定连接相关联。仅供参考,每个socket.io连接都有一个唯一的socket.id
,它与每个socket.io连接唯一关联,这样你就可以从套接字中获取id,或者只能获取给定id的套接字。