最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

NodeJS MySQL异步调用阻止进程退出

IT培训 admin 5浏览 0评论

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

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

发布评论

评论列表 (0)

  1. 暂无评论