作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
版本:
节点JS:7.2.1
express :4.15.3
MySQL NPM:2.14.1
套接字IO:2.1.1
我们刚刚在应用程序中引入了套接字,试图让通知运行。但从那时起,我的数据库就无法连接。
我不断收到PROTOCOL_CONNECTION_LOST:连接丢失:服务器关闭了连接。
错误。我已经尝试过this和 this 。它们似乎不起作用。
第一次没有建立连接,但是如果我在错误事件上设置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;
感谢任何帮助。
最佳答案
回答我自己的问题..我使用连接池解决了它..
//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');
}
});
关于mysql - 节点 + Mysql + Socket IO + PROTOCOL_CONNECTION_LOST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51191086/
版本: 节点JS:7.2.1 express :4.15.3 MySQL NPM:2.14.1 套接字IO:2.1.1 我们刚刚在应用程序中引入了套接字,试图让通知运行。但从那时起,我的数据库就无法连
我是一名优秀的程序员,十分优秀!