Javascript 数据库查询函数未异步运行

Javascript 数据库查询函数未异步运行,javascript,mysql,node.js,express,asynchronous,Javascript,Mysql,Node.js,Express,Asynchronous,因此,我在我的节点服务器中创建了一个函数,它接收一个查询字符串,在我的数据库中运行它,然后返回结果。然后,我想在整个路由中使用异步等待异步使用我的函数,而不是在嵌套查询、嵌套查询、嵌套查询等中使用嵌套查询 下面是代码: const runQuery = queryString => { console.log("...runQuery") db.query(queryString, (error, results, fields) => { if (

因此,我在我的节点服务器中创建了一个函数,它接收一个查询字符串,在我的数据库中运行它,然后返回结果。然后,我想在整个路由中使用异步等待异步使用我的函数,而不是在嵌套查询、嵌套查询、嵌套查询等中使用嵌套查询

下面是代码:

 const runQuery = queryString => {
    console.log("...runQuery")
    db.query(queryString, (error, results, fields) => {
        if (error) {
            console.log("runQeury: FAILURE");
            return error;
        }
        else {
            console.log("runQeury: SUCCESS");
            return(results);
        }
    })
}

register.post("/", async (req, res) => {
    console.log(req.body);
    const results = await runQuery("select * from test1");
    res.send(results);
})

数据库应该有3个条目,但不幸的是,它什么也不返回。意思是results在发送时是一个空变量,这意味着JS永远不会正确地等待它捕获db结果。我如何异步使用我的函数,这怎么可能呢?

看起来你的函数runQuery没有返回承诺,事实上,它没有返回任何东西。在db.query函数的回调中使用return,而不是函数runQuery本身

由于runQuery正在执行异步操作,因此应该通过一个承诺来解析结果,而这个承诺正是您的请求处理程序中等待的内容

我不太确定,但您似乎正在使用MySql,我在MySql包的npm页面上找不到任何关于所承诺的查询的内容,因此我们将自己承诺:

const runQuery = (queryString) => new Promise((resolve,reject) => {
    console.log("...runQuery")
    db.query(queryString, (error, results, fields) => {
        if (error) {
            console.error("runQuery: FAILURE");
            reject(error);
        } else {
            console.log("runQeury: SUCCESS");
            resolve(results);
        }
    })

})

register.post("/", async (req, res) => {
    console.log(req.body);
    try{
        const results = await runQuery("select * from test1");
        res.send(results);
    }catch(e){
        console.error(`ERROR THROWN BY runQuery:`,e);
        res.status(500).send({
            message: e.message || "INTERNAL SERVER ERROR"
        })
    }
})

请注意,如果发生错误,promisified函数将拒绝该错误,并且它不会存储在请求处理程序的results变量中。相反,将抛出一个需要处理的错误。因此,将任何异步/等待调用放入try/catch中始终是一个好的做法。

什么是您的db对象?它是我从另一个文件导入的基本mysql连接对象。我知道它是一个连接对象。当人们问起这个问题时,我们通常指的是把代码也放进去,或者像mysql那样描述它。您正在尝试使用Promise,但并非所有软件包都提供Promise SupportHHH。对此表示歉意。但是,是的,我今天再次检查了这个问题,发现mysql包没有promise支持。我的数据库连接来自普通的mysql包。非常感谢Anuj,你的回答很有效,并且教会了我一些关于承诺的东西!我很抱歉没有提到我使用的是基本的mysql包。事实证明,正如另一位用户所提到的,并非所有软件包都支持承诺。我假设所有db管理包都自动应用了promise包装器。我是一名实习生,所以这对我来说有点陌生,但你的回答帮助我找到了一种新的动态方式来使用Promise JS类。非常感谢。不幸的是,我的支持率太低,无法提高投票率,否则你会得到一个。对不起:不客气!没关系,我们都是来学习的。继续编码!