我有一个 Node.js 服务器托管我的网页。我最近设置了一个 MySQL 服务器并创建了到该服务器的连接。当访问某个页面时,会查询SQL数据库。
我的问题是,如果我查询数据库,它会使连接正常,但是当服务器自动关闭连接时,它会稍后崩溃。然后我尝试在查询后使用 con.end() ,但这在我访问数据库的第二次崩溃。它抛出以下错误:
at Protocol._validateEnqueue (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:203:16)
at Protocol._enqueue (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:138:13)
at Connection.query (/home/pi/Documents/node_modules/mysql/lib/Connection.js:200:25)
at Handshake.con.connect (/home/pi/Documents/PageDB.js:26:9)
at Handshake.<anonymous> (/home/pi/Documents/node_modules/mysql/lib/Connection.js:502:10)
at Handshake._callback (/home/pi/Documents/node_modules/mysql/lib/Connection.js:468:16)
at Handshake.Sequence.end (/home/pi/Documents/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
at Handshake.Sequence.OkPacket (/home/pi/Documents/node_modules/mysql/lib/protocol/sequences/Sequence.js:92:8)
at Protocol._parsePacket (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:278:23)
at Parser.write (/home/pi/Documents/node_modules/mysql/lib/protocol/Parser.js:76:12) code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }
Close the database connection.
在我看来,这是由 con.end() 运行后执行的查询引起的。有人可以帮我找出一种在回调返回 SQL 查询数据后调用 end 函数的方法吗?或者,当与数据库的连接自动关闭时,我的网络服务器不会崩溃吗?我对其中任何一个都持开放态度。谢谢!
Node.js 服务器的代码如下:
//Create a connection to the db
const con = mysql.createConnection({
host: 'localhost',
user: 'test',
password: 'test',
database: 'test',
});
router.get('/products',(req,res)=>{
con.connect((err) => {
if(err){
console.log('Error relating to connection: ' + err);
return;
}
console.log('Connection established');
con.query('SELECT * FROM ProductList',(err,rows,fields)=>{
if(!err)
res.send(rows);
else
console.log(err);
})
});
con.end(function(err) {
if (err) {
return console.log('error:' + err.message);
}
console.log('Close the database connection.');
});
});
最佳答案
您的问题是您的 con.end
在您的 connect
方法之后被调用。由于JS是异步的,所以它不会等待connect
结束然后继续end
而是会调用connect
并放置回调事件队列
并继续执行下一条语句,在该语句处关闭连接。因此,您应该做的是将 end
语句移至回调内。尝试使用以下代码
//Create a connection to the db
const con = mysql.createConnection({
host: 'localhost',
user: 'test',
password: 'test',
database: 'test',
});
router.get('/products', (req, res) => {
con.connect((err) => {
if (err) {
console.log('Error relating to connection: ' + err);
return;
}
console.log('Connection established');
con.query('SELECT * FROM ProductList', (err, rows, fields) => {
if (!err) {
res.send(rows);
con.end(function(err) {
if (err) {
return console.log('error:' + err.message);
}
console.log('Close the database connection.');
});
} else
console.log(err);
})
});
});
关于mysql - MySQL 连接结束后 Node.js 服务器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55462800/