【问题标题】:async and await on MySQL call in node js在节点 js 中异步和等待 MySQL 调用
【发布时间】:2018-12-30 14:24:40
【问题描述】:

我对 node 还是很陌生,我刚刚了解了 javascript 中提供的 async 和 await 函数。我正在尝试在下面附加的代码 sn-p 中实现此方法。据我了解,数据库响应应该首先打印到控制台,然后是“完成”,但我无法让它工作。任何帮助将不胜感激。

还请尝试解释您为修复它所做的工作,因为我想了解我做错了什么。

var mysql = require("mysql");
const cTable = require('console.table');

var connection = mysql.createConnection({
    host: "localhost",
    port: 8889,
    user: "root",
    password: "root",
    database: "testDB"
})

connection.connect((err, fields) => {
    if (err) {
        return console.log(err.code);
    }
});

var displayDB = async () => {
    connection.query('SELECT * FROM products', (err, resp) => {
        if (err) {
            return console.log(err.code);
        } else {
            table = [];
            resp.forEach((product) => {
                obj = {
                    'Product ID': product.productID,
                    'Category': product.category,
                    'Price': product.price,
                    'Stock': product.stockQuantity
                }
                table.push(obj)
            })
            console.table(table)
            connection.end()
        }
    })
}

var test = async () => {
    var x = await displayDB()
    console.log('done')
}
test()

【问题讨论】:

  • 除非connection.query 返回一个承诺,否则这是行不通的。我有一段时间没看了,但我认为 MySQL 节点模块没有。因此,您需要将其包装在一个承诺中并从函数中返回该承诺。
  • @MarkMeyer — 即使connection.query 确实返回了一个promise,它也不起作用,因为connection.query 的返回值在displayDB 中被忽略了。

标签: javascript mysql node.js


【解决方案1】:

您的displayDB 函数中没有return 语句。

通常这会导致函数返回undefined,但由于您将其声明为async,它会导致它返回立即解决的Promise。

如果您希望它等到数据库查询完成,那么您需要显式返回一个new Promise在您准备好后返回resolve (即在您致电connection.end() 之后。

【讨论】:

    【解决方案2】:

    如果你想在测试中使用await关键字,你需要从异步函数displayDB返回一个promise,你需要先了解promise是如何工作的。伪代码:

    var displayDB = () => {
        return new Promise((resolve,reject)=>{
            connection.query('SELECT * FROM products', (err, resp) => {
                if (err) {
                    reject(err)
                } else {
                    const table = [];
                    resp.forEach((product) => {
                        obj = {
                        'Product ID': product.productID,
                        'Category': product.category,
                        'Price': product.price,
                        'Stock': product.stockQuantity
                        }
                        table.push(obj)
                    })
                    resolve(table)
                }
            })
        })
    }
    
    
    var test = async () => {
       try{
        console.table(await displayDB())
        }catch(e){
            console.log(e)
        }
        connection.end()
    }
    test()
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

    【讨论】:

    • You need to return a promise from an async function 不是真的。 async function 在这里没有做任何事情,它可能是一个常规函数。您不必像它本身那样从异步函数返回承诺。
    • 利用 await 关键字,你需要在这个例子中解决一个承诺。这都是关于上下文的。承诺在这里返回一个结果,表格。
    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2019-10-27
    • 2016-12-26
    相关资源
    最近更新 更多