繁体   English   中英

在节点js中异步并等待MySQL调用

[英]async and await on MySQL call in node js

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

也请尝试说明您所做的修复操作,因为我想了解我做错了什么。

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

如果要在测试中使用await关键字,则需要从异步函数displayDB返回一个displayDB ,您需要学习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

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

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

如果你想让它等待,直到该数据库查询完成,那么你就需要显式地返回一个new Promise resolve ,当你准备(在调用之后即connection.end()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM