Узел + Mysql + Socket IO + PROTOCOL_CONNECTION_LOST - PullRequest
0 голосов
/ 05 июля 2018

Версии:

Узел JS: 7.2.1

Экспресс: 4.15.3

MySQL NPM: 2.14.1

Сокет IO: 2.1.1

Мы только что добавили сокеты в наше приложение, пытаясь запустить уведомления. Но с тех пор моя база данных просто не подключается.

Я получаю ошибку PROTOCOL_CONNECTION_LOST : Connection lost: The server closed the connection.. Я пытался это и это . Кажется, они не работают.

Соединение НЕ устанавливается в первый раз, но если я установлюInterval на событие ошибки и через некоторое время попытаюсь восстановить соединение, оно соединится .. но кое-как новый объект соединения не используется ..

Я переключаю свою ветку .. связь работает без нареканий. Есть другие члены команды, работающие одновременно, и у них нет проблем со связью. Поэтому я предполагаю, что это как-то связано с тем, как я реализовал уведомления.

Это мои файлы ниже:

// socket.js

import server from './../../server.js';
import SocketIO from "socket.io";
import nconf from "nconf";
import eventService from "../../events/service.js";

module.exports.initSocket = (IO) => {
    let event = eventService(IO);
    let notificationEmissionInterval = nconf.get('NOTIFICATION_INTERVAL_MILLISECONDS');

    IO.on("connection", (socket) => {
        setInterval(() => {
            event.emitNotifications(socket);
        }, notificationEmissionInterval);
    });
};

if (server) {
    let IO = new SocketIO(server);
    module.exports.initSocket(IO);
}

// service.js

import path from 'path';
import logger from '../config/lib/logger.js';
import notificationController from "../module/notification/controller/notification.controller.js";

module.exports = (IO) => {
    let emitNotifications = (socket) => {   
        notificationController.getUnreadNotifications(params)
        .then((notifications) => {
        //Do something
        )
    };

    return {
        emitNotifications: emitNotifications,
    }
};

// model.js

import connection from '../../../config/lib/db.js';
import logger from 'logger';
import Promise from 'bluebird';

class NotificationModel {

    getUnreadNotifications = () => {
        return new Promise((resolve, reject) => {
            let query = `CALL GetUnreadNotification()`;
            connection.query(query, (err, result) => {
                if (err) {
                    logger.error('Sql error in NotificationModel.getUnreadNotifications : ', err);
                    reject(err);
                }
                else {
                    logger.info('Unread notifications fetched successfully');
                    resolve(result);
                }
            });
        });
    };

}
export default new NotificationModel();

Файл моей базы данных в настоящее время [после большой отладки] выглядит следующим образом. Комментирование этого файла из импорта в модели уведомлений устраняет ошибку.

// db.js

import mysql from 'mysql';
import nconf from 'nconf';
import logger from './logger.js';
import path from 'path';

nconf.argv()
    .env()
    .file({
        file: path.resolve('./config.json')
    });

let dbConfig = {
    "host": nconf.get('MYSQL_HOST'),
    "port": nconf.get('MYSQL_PORT'),
    "user": nconf.get('MYSQL_USER'),
    "password": nconf.get('MYSQL_PASSWORD'),
    "database": nconf.get('MYSQL_DATABASE'),
    "stringifyObjects":true,
    "multipleStatements": true,
    "dateStrings" : 'DATETIME',
    "connectTimeout" : 60000
};

function connectToDatabase() {
    logger.info('Trying to connect to the database');
    let _conn = mysql.createConnection(dbConfig);

    _conn.connect((err) => {
        if (err) {
            logger.error('Error connecting to the database');
            logger.debug(err.code + ' : ' + err.message);
            setTimeout(connectToDatabase, 3000);
        }
        else {
            logger.info('Connected to the database via threadId : ' + _conn.threadId);
            return _conn;
        }
    });

    _conn.on('error', (err) => {
        logger.error('Error connecting to the database');
        logger.debug(err.code + ' : ' + err.message);
        setTimeout(connectToDatabase, 3000);
    });
}

let connection = connectToDatabase();

export default connection;

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 16 июля 2018

Отвечая на мой собственный вопрос .. Я решил его с помощью пула подключений ..

// db.js

let pool = mysql.createPool(dbConfig);

pool.on('connection', function (_conn) {
    if (_conn) {
        logger.info('Connected the database via threadId %d!!', _conn.threadId);
        _conn.query('SET SESSION auto_increment_increment=1');
    }
});
...