Я использую 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.info(err);
connection.query('SELECT * FROM channel WHERE channel_name = ?', channel_name, (err, rows) => {
if (err) return console.info(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 - - в командной строке, почему это происходит?
Кроме того, правильно ли это использовать пространства имен? Я хочу создать несколько каналов (пространств имен), к которым пользователи будут подключаться, а затем общаться 1 на 1 в частном порядке (комнаты)






Так реагирует система, когда вы не пишете ответ и позволяете приложению зависать.
GET /chat/uk - - ms - -
"- -" не заполнено, что означает отсутствие кода ответа, времени или размера. В переводе вы видите неизвестные свойства ответа.
Ваш код не отвечает, не генерирует код ошибки и никогда не достигает следующих строк:
if (err) return console.info(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 потенциально используются. Чтобы проверить, вы можете посмотреть направления здесь. Как получить количество неиспользуемых / используемых соединений в пуле соединений mysql nodejs? или используйте эти команды
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
Сообщите мне, если это сработает или возникнут дополнительные вопросы.
Поэтому я не уверен, что делал это до того, как использовал redis для управления каналами, мне нужно было бы оглянуться назад
О да.
connection.release();исправил :) Спасибо !! Кроме того, дополнительный вопрос: я на правильном пути? Следует ли это сделать так или есть другой (правильный) способ создать приложение с несколькими каналами?