异步并等待节点js中的mysql调用

bzzcjhmw  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(340)

我对node还很陌生,刚刚了解了javascript中提供的async和await函数。我正试图在下面所附的代码段中实现这个方法。根据我的理解,数据库响应应该首先打印到控制台,然后打印“done”,但我无法让它工作。任何帮助都将不胜感激。
请解释一下你是怎么做的,因为我想知道我做错了什么。

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()
3npbholx

3npbholx1#

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

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

hm2xizp9

hm2xizp92#

你没有 return 你的声明 displayDB 功能。
通常这会导致函数返回 undefined 但因为你宣布了 async ,它使它返回一个立即解决的承诺。
如果希望它等到数据库查询完成,则需要显式返回 new Promise 你呢 resolve 当你准备好了(即你打过电话之后 connection.end() ).

相关问题