节点 + Mysql + 套接字 IO + PROTOCOL_CONNECTION_LOST

Node + Mysql + Socket IO + PROTOCOL_CONNECTION_LOST

版本:

节点 JS:7.2.1

快递:4.15.3

MySQL NPM:2.14.1

套接字输入输出:2.1.1

我们刚刚在我们的应用程序中引入了套接字以尝试获取通知 运行。但从那以后,我的数据库就无法连接了。

我一直收到 PROTOCOL_CONNECTION_LOST : Connection lost: The server closed the connection. 错误。我试过了this and this。它们似乎不起作用。

连接不是第一次建立,但如果我在错误事件上设置间隔并尝试在一段时间后重新连接,它确实连接了..但有些新连接对象没有被使用..

我切换分支..连接完美无缺。还有其他团队成员同时工作,他们的连接没有任何问题。所以我猜这与我实现通知的方式有关。

下面是我的文件:

//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;

感谢任何帮助。

回答我自己的问题..我使用连接池解决了它..

//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');
    }
});

你也可以在你的代码中使用 pm2 他们可以轻松解决这个问题。

  1. 在 terminal/shell

    中使用此命令

    pm2 init //they provide you ecosystem.config.js

  2. 修改生态系统文件以满足您的需求

  3. 将 pm2 添加为项目的依赖项

    npm install pm2 or yarn add pm2

  4. 在您的 package.json 中,修改您的起始券。

点赞。

{
   "scripts": {
            "start": "pm2-runtime start ecosystem.config.js --env production"
            }
}

最后

npm start