异步等待不与回调节点一起工作(无承诺)

时间:2018-12-10 14:08:14

标签: node.js express

大家好,我很困惑为什么这不起作用 这是我的连接js 文件

    function getConnection(callback) {
        initPool()
        mysql_pool.getConnection((err, conn) => {
            if (err) {
                return callback(err);
            }
               return callback(err, conn);
        });
     }

    function query(queryString, callback) {

        getConnection((err, connection2) => {
            if (connection2 != undefined) {
                if (err) {
                    connection2.destroy();
                return  callback(createDataResponseObject(err, null))
                }
                connection2.query(queryString, function (err, rows) {
                    connection2.destroy();
                    if (!err) {
                        return callback(createDataResponseObject(err, rows))
                    }
                    else {
                        return callback(createDataResponseObject(err, null))
                    }
                });                   
            }

        });
    }
    function createDataResponseObject(error, results) {
        if (error) {
            logger.info(error);
        }
        return {
            error: error,
            results: results === undefined ? null : results === null ? null : results
        }
    }

现在,当我在下面的 router.js 中获取此连接js时,示例代码

   var conn=require("./connection")
   router.post('/test',async function(res,req){
      var query ="select * from users"
      let x= await conn.query(result);
      console.log(x)        
   });      

在连接js文件中,我没有使用promise,那么为什么异步在路由器中不起作用,即它仍然可以工作,因为我使用回调可以让任何人告诉我我缺少了什么或做错了什么。当我尝试在connection.js文件中使用返回承诺进行尝试时,它可以正常工作。我知道异步返回承诺

3 个答案:

答案 0 :(得分:3)

异步/等待仅适用于诺言,它是一种语法糖。即您不能将语法与回调一起使用。

查看此链接:https://javascript.info/async-await

答案 1 :(得分:3)

您只能等待诺言。 conn.query不返回承诺。它没有return语句:它返回undefined

您需要promisify数据库功能。

答案 2 :(得分:1)

异步仅与promise一起使用,要使事情正常工作,您必须首先将所有函数转换为返回promise。您可以使用Promise.promisify()转换所有回调样式函数以返回承诺。完成后,您可以将这些功能与async-await一起使用。