@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]);
    });

});
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
@mitya_k
Используй pool для работы с mysql

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

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

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