数据库查询功能未异步运行

时间:2020-02-23 06:11:45

标签: javascript mysql node.js express asynchronous

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

下面是代码:

 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个条目,但是不幸的是,它什么也不返回。意味着结果在发送时是一个空变量,这意味着JS永远不会适当地等待它捕获数据库结果。我该如何异步使用我的函数,这怎么可能呢?

1 个答案:

答案 0 :(得分:1)

似乎您的函数“ runQuery”没有返回承诺,实际上,它没有返回任何内容。您在db.query函数的回调中使用“返回”,而不是函数“ runQuery”本身。

由于runQuery正在执行异步操作,所以应该通过一个promise(这是您的请求处理程序中的“等待”所寻找的)来解析结果。

我不确定,但似乎您使用的是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"
        })
    }
})

请注意,如果发生错误,我们的承诺函数将拒绝该错误,并且不会将其存储在请求处理程序的“结果”变量中。相反,将引发需要处理的错误。因此,将所有异步/等待调用放入try / catch中是始终的好习惯。