节点+ Mysql +套接字IO + PROTOCOL_CONNECTION_LOST

时间:2018-07-05 12:15:54

标签: mysql socket.io connection database-connection

版本:

Node JS:7.2.1

Express:4.15.3

MySQL NPM:2.14.1

套接字IO:2.1.1

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

我一直收到PROTOCOL_CONNECTION_LOST : Connection lost: The server closed the connection.错误。我已经尝试过thisthis。他们似乎没有工作。

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

我切换了我的分支。连接正常进行。还有其他团队成员同时工作,他们的连接没有任何问题。因此,我猜测这与我实施通知的方式有关。

以下是我的文件:

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

// db.js

__NEXT_DATA__

答案 1 :(得分:0)

您还可以在代码中使用pm2,它们可以轻松解决此问题。

  1. 在终端机/外壳中使用此命令

    var myItems = App.ls.getSubscriptions()[6].getItems(); var myFields = App.ls.getSubscriptions()[6].getFields(); var adaptername = App.ls.getSubscriptions()[6].getDataAdapter(); var myEH3 = function ff(msg) { console.log('message received.'); }; var mySub = new Subscription("MERGE", myItems, myFields); mySub.setDataAdapter(adaptername); mySub.setRequestedSnapshot("yes"); mySub.addListener({onItemUpdate: myEH3}); App.ls.subscribe(mySub);

  2. 修改生态系统文件以符合您的需求

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

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

  4. 在package.json中,修改您的启动脚本。

类似于以下内容。

npm install pm2 or yarn add pm2

最后

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