NodeJS 不能等待 MySQL 数据库承诺,而是等待其他承诺

Posted

技术标签:

【中文标题】NodeJS 不能等待 MySQL 数据库承诺,而是等待其他承诺【英文标题】:NodeJS can't await MySQL database promise, but awaits other promises 【发布时间】:2021-10-10 02:36:57 【问题描述】:
let static_times_generate = async (static_file_path) => 
    //Import mysql database pool connection:
    const db = require('../database_pool.js');
    const Promise_pool = db.promise();

    //Import Static Text file dependencies:
    const  readFile  = require('fs/promises') , stop_times = static_file_path+'/stop_times.txt', trips = static_file_path+'/trips.txt';

    let trip_data = (await readFile(trips,'utf8')).split('\n').slice(1,2);
    let stop_times_data = (await readFile(stop_times,'utf8')).split('\n').slice(1,-1);

    trip_data.forEach(trip_line => 
        const t_array = trip_line.split(',');
        stop_times_data.forEach(st_line =>
            const st_array = st_line.split(',');

            if(st_array[0] == t_array[2])
                if(t_array[1] == 'SundaySum') t_array[1] = 'Sunday'  
                else if(t_array[1] == 'SaturdaySum') t_array[1] = 'Saturday' 
            
//Here is the issue
            await Promise_pool.execute(`INSERT INTO static_times (1, 2, 3, 4, 5, 6, 7) VALUES (?,?,?,?,?,?,?)`
            ,[elm1,elm2,elm3,elm4,elm5,elm6,elm7] )
            
        );
    );

    console.log("COMPLETED!")
    

static_times_generate('./mysql_table_generators/STATIC_FILES'); //This is how i'm calling the function

我读取文件并将某些数据推送到 MySQL 数据库中,为此我使用节点 mysql2。

    let trip_data = (await readFile(trips,'utf8')).split('\n').slice(1,2);
    let stop_times_data = (await readFile(stop_times,'utf8')).split('\n').slice(1,-1);

readFile 承诺正在等待中,但是当涉及到 Promise_pool 查询时,它给出了错误:

            await Promise_pool.execute(`INSERT INTO static_times (routeId, serviceId, tripId, stopId, arrivalTime, orientation, tripHeadsign) VALUES (?,?,?,?,?,?,?)`
            ^^^^^

SyntaxError: await is only valid in async function
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47

我已经在我的代码的其他文件中完成了这种等待,并且它有效,为什么它不能识别等待被包装在异步函数中? (我也试过 await db.execute 方法,没有使用 db.promise() 原型)

这是我的 database_pool.js 文件

const mysql = require('mysql2');

const db_pool = mysql.createPool(
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'drt_sms_db',
    multipleStatements: true
);

module.exports = db_pool;

*** 是的,我知道我不需要需要等待,但是我将 100 万行插入到我的数据库中,所以我收到了 MySQL ETIMEOUT 错误。 await 是我目前唯一的选择。

【问题讨论】:

【参考方案1】:

您的 await 调用范围仅限于 forEach 回调函数。如果你想使用 await,你可以像这样将 async 添加到 forEach 回调中:

stop_times_data.forEach(async (st_line) => 
   await doSomething();

话虽如此,这里的回调函数实际上并不等待承诺完成,因为forEach 只接受同步函数。查看here 了解更多详情。如果您需要等待一个请求完成后再发送另一个请求,您应该改用for 循环。

【讨论】:

以上是关于NodeJS 不能等待 MySQL 数据库承诺,而是等待其他承诺的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助在 NodeJS 中使用 Sinon 存根异步 / 等待承诺

使用 mySQL 和 nodejs 传递承诺

等待所有承诺成功

NodeJS Express 异步/等待

Nodejs 承诺 async/await 不能正常工作

一个承诺的 mysql 模块将如何与 NodeJS 一起工作?