【问题标题】:Socket.io namespace stops working after 10 connectionsSocket.io 命名空间在 10 个连接后停止工作
【发布时间】:2018-12-09 17:02:39
【问题描述】:

我正在使用 node.js、ejs、express、mysql 和 socket.io。 我的服务器看起来像这样(index.js):

module.exports = function(io) {

var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var pool = mysql.createPool({
    connectionLimit: 10,
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'chat'
});

router.get('/chat/:channel_name', (req, res, next) => {
    var channel_name = req.params.channel_name;
    // get the countries from the database so we make sure the users are connecting to the correct channel to chat, else redirect to /chat
    pool.getConnection((err, connection) => {
        if(err) return console.log(err);
        connection.query('SELECT * FROM channel WHERE channel_name = ?', channel_name, (err, rows) => {
            if(err) return console.log(err)
            if(!rows.length){
                return res.redirect('/chat')
            }
            res.render('channel', {channel_name: rows[0].channel_name})
            var channel = io.of(`/chat/${rows[0].channel_name}`);
            channel.on('connection', function(socket){
              socket.join(rows[0].channel_name)
              channel.to(rows[0].channel_name).emit('say hi', 'Hi from ' + rows[0].channel_name + '!');
            });

        });
    }); 
});

router.get('/chat', function(req, res, next) {
    res.render('chat');
});

return router;   
}

客户:

<!DOCTYPE html>
<html>
<head>
    <title><%= channel_name %></title>
</head>
<body>
<div id="message"></div>
</body>
</html>
<script src="/js/lib/jquery/jquery-3.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
<script>
var socket = io(`/chat/<%= channel_name %>`);

socket.on('say hi', function(data){
    $('#message').append(`<div>${data}</div>`)
})
</script>

基本上,当我重新启动服务器并尝试,例如:/chat/uk,它会显示在 html 页面上:Hi from uk!
但是,重新启动页面 10 次后,(第 11 次)浏览器一直在加载,并且在命令提示符下显示 GET /chat/uk - - ms - -,为什么会出现这种情况?
另外,这是使用命名空间的正确方法吗?我想创建用户将连接的多个频道(命名空间),然后私下一对一聊天(房间)

【问题讨论】:

    标签: mysql node.js express socket.io ejs


    【解决方案1】:

    这是当您不编写响应并允许应用挂起时系统的反应方式。

    GET /chat/uk - - ms - -
    


    “- -”为空白,表示没有响应代码、时间或大小。翻译后,您会看到响应的未知属性。

    您的代码没有响应,也没有生成错误代码,并且永远不会到达这些行:

        if(err) return console.log(err) //happens twice 
    
    
        return res.redirect('/chat')
    
    
        res.render('channel', {channel_name: rows[0].channel_name})
    

    问题可能出在这一行:

        connection.query('SELECT * FROM channel WHERE channel_name = ?', channel_name, (err, rows) => {
    

    您永远不会关闭以前与数据库的连接。尝试添加

        connection.release();
    

    在代码中的某个点,因为到 mysql 数据库的可用连接可能会被用完。要检查,您可以查看路线here How to get number of unused/used connection in nodejs mysql connection pool ? 或使用这些命令

    pool.config.connectionLimit     // passed in max size of the pool
    pool._freeConnections.length    // number of free connections awaiting use
    pool._allConnections.length     // number of connections currently created, including ones in use
    pool._acquiringConnections.length // number of connections in the process of being acquired
    

    让我知道这是否有效或是否有后续问题。

    【讨论】:

    • 啊,是的。 connection.release(); 已修复 :) 谢谢!!另外,一个额外的问题,我在正确的轨道上吗?应该这样做还是有另一种(正确的)方法来创建具有多个渠道的应用程序?
    • 因此,在我使用 redis 管理频道之前,我并不积极这样做,我需要回顾一下
    猜你喜欢
    • 2015-10-08
    • 2012-10-03
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多