Задать вопрос
@generate
...

Как использовать mysql + web socket?

При подключении и выполнении каких то действий пользователя на сервер отправляются данные с помощью webscoket. Но после 3-10 минут скрипт выдает ошибку и все отключается.
Текст ошибки

node:events:491
      throw er; // Unhandled 'error' event
      ^

Error: Connection lost: The server closed the connection.
    at Protocol.end (C:\Users\netli\node_modules\mysql\lib\protocol\Protocol.js:112:13)
    at Socket.<anonymous> (C:\Users\netli\node_modules\mysql\lib\Connection.js:94:28)
    at Socket.<anonymous> (C:\Users\netli\node_modules\mysql\lib\Connection.js:526:10)
    at Socket.emit (node:events:525:35)
    at endReadableNT (node:internal/streams/readable:1359:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
Emitted 'error' event on Connection instance at:
    at Connection._handleProtocolError (C:\Users\netli\node_modules\mysql\lib\Connection.js:423:8)
    at Protocol.emit (node:events:513:28)
    at Protocol._delegateError (C:\Users\netli\node_modules\mysql\lib\protocol\Protocol.js:398:10)
    at Protocol.end (C:\Users\netli\node_modules\mysql\lib\protocol\Protocol.js:116:8)
    at Socket.<anonymous> (C:\Users\netli\node_modules\mysql\lib\Connection.js:94:28)
    [... lines matching original stack trace ...]
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  fatal: true,
  code: 'PROTOCOL_CONNECTION_LOST'
}


Как сделать чтобы не было ошибок ? При каждом выполнении sql запроса открывать новое соединение к mysql и закрывать его ?

Подскажите в каком месте открывать и закрывать соединение в данном случае в базе данных.

const { Server } = require('ws');
const querystring = require('querystring');
const url = require('url');
const mysql = require('mysql');



const server = new Server({ port: 3000 });

var clients = {};

server.on('connection', function connection(ws, request, client) {
    
    const connection = mysql.createConnection({host: '127.0.0.1', user: 'root', password: 'root', database: 'base'});
    
    const q = url.parse(request.url);
    const output = querystring.decode(q.query);
    
    
    if(output.id === undefined) {
        return false;
    }
    
    let id = output.id;
    
    connection.query("UPDATE `user_pay` SET `online` = 1 WHERE `id` = ?", [id]);
    
    clients[id] = id;


    server.clients[id] = ws;

    
    ws.on('message', function message(data) {
        //
    });

    //Закрытие сокета
    ws.on('close', () => {
        connection.query("UPDATE `user_pay` SET `online` = 0 WHERE `id` = ?", [id]);
    });

});
  • Вопрос задан
  • 268 просмотров
Подписаться 1 Простой 10 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Бэкенд на Node.js для фронтенд-разработчиков
    3 месяца
    Далее
  • Skillbox
    Node.js
    2 месяца
    Далее
  • Stepik
    Microservices - паттерны и практика построения микросервисов
    1 неделя
    Далее
Решения вопроса 1
@mitya_k
Используй pool для работы с mysql

Pool создается один раз для всего приложения, как правило, но точно не на каждое клиентское соединение по вебсокетам
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы