1

我将 Express4 与指向 path 的路由器一起使用/,并且由名为​​ .js 的 JS 文件处理chat.js

而且我的 IO 对象已经绑定到app.io,所以在我的内部我chat.js将通过 using 调用我的 Socket.IO req.app.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'));

聊天.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
4

1 回答 1

2

每次您的/路线被击中时,您都会创建一个新的重复io.on('connection', ...)事件处理程序。因此,在该路由被击中 3 次之后,您将拥有 3 个事件处理程序connection。因此,当它发生时,您的代码会被调用 3 次。

相反,您应该io.on('connection', ...)只在路线之外做一次。


仅供参考,您似乎没有对uid您正在创建的内容做任何有用的事情,因为您没有将其与任何特定连接相关联。仅供参考,每个 socket.io 连接已经有一个唯一的socket.id,它与每个 socket.io 连接唯一关联,因此您可以从套接字获取 id 或者可以检索仅给定 id 的套接字。

于 2017-06-14T07:28:21.617 回答