我有一个包含对象的配置数组。根据这些对象中的属性,将为数组中的每一行建立一个查询。因此,正在执行的查询数量不是固定数量。
这些查询中的数据然后需要插入到另一个表中。我已经编写了一些执行此操作的代码,但是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) => {})
}
}
});
}
答案 0 :(得分:0)
只要您与MySQL服务器的连接处于打开状态,该程序就不会退出。
您必须调用db.end()
才能关闭连接并允许程序退出。在此处查看文档:{{3}}
答案 1 :(得分:0)
所以我最终要做的是为for循环中的每个项目创建一个promise,并将它们推送到一个数组,然后使用以下代码来确保在结束数据库连接之前所有的promise都已解决:
Promise.all(promises).then(() => db.end());