我的服务器api位于alwayse alwaysdata上。 x时间过后,服务器崩溃。
events.js:183
throw er;
// Unhandled 'error' eventError: Connection lost: The server closed the connection.
at Protocol.end (/home/ec2-user/node_modules/mysql/lib/protocol/Protocol.js:112:13)
at Socket.<anonymous> (/home/ec2-user/node_modules/mysql/lib/Connection.js:97:28)
at Socket.<anonymous> (/home/ec2-user/node_modules/mysql/lib/Connection.js:502:10)
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickCallback (internal/process/next_tick.js:181:9)
我正在查看这是否与mysql错误无关。但是现有的帖子对我没有帮助。我认为服务器mysql切断了连接,我不知道为什么。 在这里我建立了连接:
let con = mysql.createConnection({
host: "alwaysdata.net",
user: "user",
password: "",
database: "database"
});
try {
con.query(check, (err, customer) => {
if (err){
console.log("%s Error on check query",Date());
throw err;
}
答案 0 :(得分:0)
我相信您可以通过两种方式处理此问题。
对于这两个例子,都有一个很好的例子here。
服务器断开连接
由于网络问题,您可能会失去与MySQL服务器的连接, 服务器使您超时,服务器重新启动或崩溃。 所有这些事件都被认为是致命错误,并且具有 err.code ='PROTOCOL_CONNECTION_LOST'。请参阅错误处理部分 有关更多信息。
通过建立新连接来重新连接。 终止后,无法重新连接现有的连接对象 通过设计。
使用池,断开的连接将从池中删除 释放空间以在下一个创建新连接 getConnection调用。
答案 1 :(得分:0)
let connection=null;
function handleDisconnect() {
connection = mysql.createConnection({
host: "alwaysdata.net",
user: "user",
password: "",
database: "database"
}); // Recreate the connection, since
// the old one cannot be reused.
connection.connect(function (err) { // The server is either down
if (err) { // or restarting (takes a while sometimes).
console.log('error when connecting to db:', err);
setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
} // to avoid a hot loop, and to allow our node script to
}); // process asynchronous requests in the meantime.
// If you're also serving http, display a 503 error.
connection.on('error', function (err) {
console.log('db error', err);
if (err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
handleDisconnect(); // lost due to either server restart, or a
} else { // connnection idle timeout (the wait_timeout
throw err; // server variable configures this)
}
});
}
handleDisconnect();
setInterval(function () {
connection.query('SELECT 1');
}, 5000);
module.exports = connection;
您导出连接对象,并将其用于其他连接查询。
我每5秒调用一次Query来保持连接状态,我尝试了所有其他方法,而这种方法就像一种魅力。
答案 2 :(得分:0)
尝试连接池:
const mysql = require('mysql');
let pool = mysql.createPool(
{
connectionLimit : 100,
host : '172.17.0.1',
port : 3306,
user : 'test',
password : 'test',
database : 'test',
multipleStatements: true
}
);
...
pool.query(sql, params, function(err, rows) {
...
它在我的mysql 5.7和8版本上稳定运行
答案 3 :(得分:0)
Manish 的回答对我有用!
过去两天我一直在为此苦苦挣扎。我在我的本地主机上运行了一个带有 mysql db 的 nodejs 服务器,在使用 cleardb 插件迁移到 heroku 后,我遇到了几个问题。我在配置文件中有此代码:
const mysql = require('mysql');
const db = mysql.createConnection({
host: 'host',
database: 'database',
user: 'user',
password: 'password', });
module.exports = db;
我将其更改为 Manish 提到的处理断开连接的方法。