【问题标题】:how to execute a MySQL Query within an Asynchronous function within a node application如何在节点应用程序的异步函数中执行 MySQL 查询
【发布时间】:2020-05-19 13:52:08
【问题描述】:

我在 node/express JS 应用程序中使用 MySQL 时遇到了一些问题。似乎当尝试在异步函数中访问 MySQL 数据库时,代码将“跳过”SQL 并同步运行。这是我的代码;我正在调用 getDeparturesForStop 方法。

async function getDeparturesForStop(stop_id, route_type, con) {
    console.log("---Log before Asynch---");
    departures = await getDeparturesFromDatabase(con,stop_id);
    console.log("departures is : ");
    console.log(departures);
    console.log("---Log after Asynch---")
}

getDeparturesFromDatabase 方法:

async function getDeparturesFromDatabase(con,stop_id){
    let myresult;
    con.query(`select * from departures WHERE stopID = ${stop_id} AND timestamp = '2020-04-08 13:48:00'`,function (err, result, fields){
        myresult = result[0];
        console.log("MyRes Inside sql query is :  ");
        console.log(result[0]);
    });
    return myresult;
}

我期望的结果是:

---Log before Asynch---
MyRes Inside sql query is :
//The result from the SQL  Query
departures is : 
//The result from the SQL Query
---Log after Asynch---

但是,似乎 asynch 函数在所有操作之后都被调用了。实际输出为:

---Log before Asynch---
departures is :
undefined
---Log after Asynch---
MyRes Inside sql query is :
//The result from the SQL  Query

我不确定我是否错误地使用了这些方法。只有在 Async 函数中使用 MySQL Query 时才会发生这种情况。例如,如果我要在以下 fassion 中分配一个变量,它将按预期输出:

async function getDeparturesFromDatabase(con,stop_id){
let myresult = 5;
return myresult;
}

这将按预期异步返回值:

---Log before Asynch---
departures is : 
5
---Log after Asynch---

我不确定这是 MySQL 库的问题,还是我开发方法的方式的问题。

【问题讨论】:

    标签: javascript mysql express asynchronous


    【解决方案1】:

    await 期望 Promise 起作用。您需要承诺query 方法。

    function getDeparturesFromDatabase(con,stop_id) {
        return new Promise((resolve, reject) => {
            const query = `select * from departures WHERE stopID = ${stop_id} AND timestamp = '2020-04-08 13:48:00'`;
            con.query(query, function (err, result, fields){
                if(err){
                    reject(err);
                    return;
                }
                resolve(result[0]);
            });
        })
    }
    

    【讨论】:

    • 这按预期工作。 - 当您说“请注意”时,您是否打算添加任何额外的 cmets?
    • Opss... 编辑它。 tnx
    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多