为什么这个node.js-mysql查询会阻止我的程序结束



我正在尝试修复node.js应用程序中的一个错误,该错误使我编写的程序无法成功结束。

脚本正在返回所需的结果,但后台仍在运行某些内容,这似乎阻止了它终止。

通过消除过程,我已经能够将罪魁祸首缩小到这个getPlayers()函数;但我不确定为什么会引起这个问题。

首先,我从一个模块导出数据库池,如下所示:

require('dotenv').config()
const mysql = require("mysql"),
pool = mysql.createPool({
host: process.env.dbHost,
user: process.env.dbUser,
password: process.env.dbPassword,
database: process.env.dbDatabase
})
pool.connectionLimit = 15
module.exports = pool

这似乎是导致所有问题的查询:

const getPlayers = () => {
return new Promise((resolve, reject) => {
db.query('SELECT * FROM cc_players', (err, res) => {
if(err)
console.log(err)

resolve(res)
})
})
}

如果我注释掉db.query()函数,并简单地解析一个空数组,那么脚本将按预期终止。数据库查询是否有可能导致脚本继续在后台运行?

因为您正在创建一个池,所以以前打开的SQL连接将不会关闭,而是保留以供以后使用。这就是Node.JS从不退出的原因。

为了解决此问题,mysql包提供了一个pool.end函数来关闭池中的所有连接。您应该在脚本准备退出时调用它,也许是这样的:

function onExit() {
// ...
// Assuming ``db`` is the pool you created
db.end()
// ...
}

请注意,在调用pool.end之后,无法对池执行进一步的SQL操作。

您创建了一个池,该池将保持连接打开以供重用。只要有打开的套接字,Node.js就不会退出。

您必须使用另一种方式,因为创建池将在后台保持连接打开,所以您可以使用createConnection函数而不是createPool,然后您可以手动关闭连接

let mysql = require('mysql');
let connection = mysql.createConnection({
host: process.env.dbHost,
user: process.env.dbUser,
password: process.env.dbPassword,
database: process.env.dbDatabase
});
const getPlayers = () => {
return new Promise((resolve, reject) => {
db.query('SELECT * FROM cc_players', (err, res) => {
if(err)
console.log(err)

resolve(res)
})
})
}

一旦得到回调,你就可以关闭连接

getPlayer().then(res => {
.
.
.
connection.end();
})

相关内容

最新更新