【问题标题】:Socket.io listeners are increases when page reload. Node js重新加载页面时会增加 Socket.io 侦听器。节点js
【发布时间】:2016-06-07 09:30:47
【问题描述】:

因此,如果使用socket.io 中的示例,但将io.on 函数放入app.get,则听众会增加。我怎样才能正确解决这个问题?我使用了多种解决方案,但它们更像是“胶带”而不是正确的解决方案。 例如

socket.removeAllListeners();

function socketio() {
    var counter = 1;
    io.on('connection', function (socket) {
        if (!(counter)) {
            counter--;
            socket.emit('news', {hello: 'world'}, function () {
            });
            socket.on('my other event', function (data) {
                console.log(data);
            });
        }
    });
}

感谢和抱歉我的英语。

服务器代码:

var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

app.use(express.static(__dirname + '/public'));

function socketio() {
    io.on('connection', function (socket) {
        socket.emit('news', {hello: 'world'}, function () {
        });
        socket.on('my other event', function (data) {
            console.log(data);
        });
    });
}
app.get('/', function (req, res) {
    socketio();
    res.render('socket.jade');
});

客户端代码

var socket = io.connect('http://localhost');
socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' }, function(){
    });
});

第一页重新加载后

Server console.log
{ my: 'data' }

Client console.log
Object { hello: "world" }

第二次重载

Server console.log

{ my: 'data' }
{ my: 'data' }
{ my: 'data' }
{ my: 'data' }

Client console.log
Object { hello: "world" }
Object { hello: "world" }

等等……

【问题讨论】:

    标签: javascript node.js express socket.io


    【解决方案1】:

    这是因为每次加载路由处理程序时,都会告诉 socket.io 再次添加事件监听器。 socket.io 在一个单独的通道上监听 websocket 连接,所以你只需要运行一次io.on('connection' ...。试试这个:

    var express = require('express');
    var app = express();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    
    server.listen(80);
    
    app.use(express.static(__dirname + '/public'));
    
    io.on('connection', function (socket) {
        socket.emit('news', {hello: 'world'}, function () {
        });
        socket.on('my other event', function (data) {
            console.log(data);
        });
    });
    
    app.get('/', function (req, res) {
        res.render('socket.jade');
    });
    

    如果您需要处理特定用户的 websocket 连接,您应该管理来自 connection 处理程序的各个 socket 对象。每一个都是一个用户的连接。

    【讨论】:

    • 是的,但是如果我需要在io 中获得req.session。如果没有app.get/app.use,我该怎么做? function dataInsert(req) { io.on('connection', function (socket) { socket.on('data', function (data) { data.toString(); dataTasksInsert(req.session.user, data); }); }); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多