首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Socket.io命名空间在10个连接之后停止工作

Socket.io命名空间在10个连接之后停止工作
EN

Stack Overflow用户
提问于 2018-07-01 01:18:52
回答 1查看 170关注 0票数 1

我使用node.js、ejs、express、mysql和socket.io。我的服务器看起来如下(index.js):

代码语言:javascript
复制
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;   
}

客户端:

代码语言:javascript
复制
<!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 - -,为什么会发生这种情况?

而且,这是使用名称空间的正确方式吗?我想要创建多个通道(命名空间),用户将连接,然后私下聊天1对1(房间)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-01 01:49:03

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

代码语言:javascript
复制
GET /chat/uk - - ms - -

翻译后,您将看到响应的未知属性。

您的代码既没有响应,也没有生成错误代码,并且永远不会将其生成到以下几行:

代码语言:javascript
复制
    if(err) return console.log(err) //happens twice 


    return res.redirect('/chat')


    res.render('channel', {channel_name: rows[0].channel_name})

问题可能在这条线上:

代码语言:javascript
复制
    connection.query('SELECT * FROM channel WHERE channel_name = ?', channel_name, (err, rows) => {

您从未关闭到数据库的先前连接。试着添加

代码语言:javascript
复制
    connection.release();

在代码的某个时候,因为到mysql数据库的可用连接可能会被耗尽。要检查,您可以查看此处的说明( How to get number of unused/used connection in nodejs mysql connection pool ? )或使用以下命令

代码语言:javascript
复制
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

请告诉我这是否可行,或者是否有后续问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51119716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档