版本:
节点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.
错误。我试过这个和这个。它们似乎不起作用。
连接不是第一次建立的,但是如果我在错误事件上设置了间隔,并在一段时间后尝试重新连接,它会连接。。但是一些新的连接对象是如何不被使用的。。
我换了我的分行。。连接工作完美无瑕。其他团队成员同时工作,他们的连接没有任何问题。所以我猜这与我实现通知的方式有关。
以下是我的文件:
//插座.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);
}
//服务.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,
}
};
//模型.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();
我的数据库文件目前[经过大量调试]如下所示。在通知模型中从导入中注解掉这个文件可以解决这个错误。
//数据库.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条答案
按热度按时间txu3uszq1#
你也可以在你的代码中使用pm2他们可以很容易地处理这个问题。
在终端/shell中使用此命令
pm2 init //they provide you ecosystem.config.js
修改生态系统文件以满足您的需要将pm2作为依赖项添加到项目中
npm install pm2 or yarn add pm2
在package.json中,修改start scrip。如下所示。
最后
hi3rlvi22#
回答我自己的问题。。我用连接池解决了。。
//数据库.js