NodeJS MySQL异步调用阻止进程退出
我有一个包含对象的配置数组。根据这些对象中的属性,为数组中的每一行构建一个查询。因此,正在执行的查询量不是设定的数量。
然后,需要将来自这些查询的数据插入另一个表中。我编写了一些执行此操作的代码,但我遇到了NodeJS异步行为的一些问题。由于MySQL调用是异步执行的,因此NodeJS进程无法正确退出。如果我在脚本结束时自己关闭进程,则不会处理所有MySQL调用。
我怀疑我必须在某处使用承诺,但我并不熟悉它们。
这是我已经拥有的。它目前以非常同步的方式编写,但这是我目前最熟悉的。
require('dotenv').config();
const mysql = require('mysql');
const db = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
});
let items = [
{"type": "A", "col1": "test"},
{"type": "B", "col1": "lorem"}
];
let lastId = 0;
for (let item of items) {
console.log(item);
let query = 'SELECT * FROM testtable1 WHERE id > ? ';
let queryParams = [lastId];
for (let itemProp in item) {
if (item.hasOwnProperty(itemProp)) {
query += ' AND ' + itemProp + ' = ?';
queryParams.push(item[itemProp]);
}
}
console.log(db.format(query, queryParams));
db.query(query, queryParams, (err, results, fields) => {
if (err) throw err;
if (results.length > 0) {
for (let row of results) {
let rowData = {
col1: row.col1,
col2: row.col2
};
db.query('INSERT INTO testtable2 SET ?', rowData, (err, res) => {})
}
}
});
}
回答如下:
只要您的连接对MySQL服务器开放,程序就不会退出。
您必须调用db.end()
才能关闭连接并允许程序退出。请参阅此处的文档:https://github/mysqljs/mysql/blob/master/Readme.md#terminating-connections