NodeJS MySQL异步调用可防止进程退出

时间:2019-02-18 10:44:20

标签: mysql node.js asynchronous es6-promise

我有一个包含对象的配置数组。根据这些对象中的属性,将为数组中的每一行建立一个查询。因此,正在执行的查询数量不是固定数量。

这些查询中的数据然后需要插入到另一个表中。我已经编写了一些执行此操作的代码,但是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) => {})
                }
            }
        });
    }

2 个答案:

答案 0 :(得分:0)

只要您与MySQL服务器的连接处于打开状态,该程序就不会退出。
您必须调用db.end()才能关闭连接并允许程序退出。在此处查看文档:{​​{3}}

答案 1 :(得分:0)

所以我最终要做的是为for循环中的每个项目创建一个promise,并将它们推送到一个数组,然后使用以下代码来确保在结束数据库连接之前所有的promise都已解决:

Promise.all(promises).then(() => db.end());