繁体   English   中英

不了解此与axios的异步等待调用

[英]Don't understand this async await call with axios

我正在使用节点10+,并且具有此函数,在该数据库中执行数据库查询,然后等待结果并返回:

var test3 = (req,res,query) => {   
    var conn = new sql.ConnectionPool(dbconfig);
    var req = new sql.Request(conn);
    var result;
    return  conn.connect().then(async() => {       
            result = await req.query(query);               
            conn.close();
            return result;

           }).catch(e => {
                return e;
           }).finally(() => {
                conn.close();
           });   
}

首先,我想知道为什么我必须返回conn.connect()块。

return  conn.connect().then(async() => {...  

我知道这与我认为的诺言链有关,但是我不明白为什么,因为我的异步db调用已经从await dbcall函数中解决了……我只是从函数内部返回结果

然后,我有一个路由器,我在这里调用api函数:

router.get("/api/compareCount",  function(req,res) {
    var query = `SELECT COUNT(*) as count
      FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch] where lastChange < dateadd(day,-1,getdate())`;
      var query2 = `SELECT COUNT(*) as count
      FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch] where lastChange < dateadd(hour,-8,getdate())`;
      var query3 =`SELECT COUNT(*) as count
      FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch]`;
    axios.all([searchES(req,res),   test3(req,res,query),   test3(req,res,query2) , test3(req,res,query3)])
    .then(axios.spread(function (esCount, mssqlCount1, mssqlCount2, mssqlCount3) {
        totalES = esCount.hits.total;

        totalMSSQL  = mssqlCount1.recordset[0].count;
        totalMSSQL2 = mssqlCount2.recordset[0].count;
        totalMSSQL3 = mssqlCount3.recordset[0].count;totalMSSQL,  " mssqlCount2: ", totalMSSQL2, "mssqlCount3: ", totalMSSQL3);
        var msg = "ES Dokumente total: " + totalES + " MSSQL Dokumente total: " + totalMSSQL + "<br>";
        if ( totalES != totalMSSQL) {
            msg += "Critical: " + totalES != totalMSSQL + "<br>"; 
        } if ((totalES != totalMSSQL2))  {            
            msg += "Warning: " + (totalES != totalMSSQL2) + "<br>";
        } if ((totalES > totalMSSQL3))  {  
            msg += "Achtung es gibt ungelöschte Dokumente im Elasticsearch Index!";
        }      
        res.set('Content-Type', 'text/html');
        res.send(msg);
    })).catch((err) => {
        res.send(err);
    });
})

router.get("/api/test3", async function (req,res) {
    var query = `SELECT COUNT(*) as count
      FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch] where lastChange < dateadd(day,-1,getdate())`;
    var result = await test3(req,res,query);
    res.json(result);
})

api / test3路由照常向我返回结果,但是api / compareCount也确实向我返回了正确的结果...

此外,我必须使用async函数... await test3(..)async-await语法结构来将我的结果解析为一个变量...但是我上面的api / compareCount函数不必使用相同的结构,结果无论如何都会在.then(axios.spread(function(...))) 这是为什么? 我很困惑,因为我真的不知道Promise链接和调用的内部工作原理...

编辑:在我的test3()函数之前,我有这样的事情:

async function testQuery(query) {
    try {
        let pool = await sql.connect(dbconfig);
        let result1 = await pool.request()
            //.input('input_parameter', sql.Int, value)
            .query(query);  
            sql.close();  
        return result1;      

    } catch (err) {
        console.log(err);
        sql.close();  

    } finally {
        sql.close();
    }
};

我也获得了该函数的结果,但是,我遇到了某种竞争状况,它告诉我sql-连接已经存在,并且如果我重新加载页面的速度太快,请首先执行sql.close()……我不明白这与test3()函数不再...

首先, test3()需要返回一个Promise,以便调用者知道何时完成以及是否有错误。 使用async / await可能最简单:

async function test3(query) => {   
    const conn = new sql.ConnectionPool(dbconfig);
    const request = new sql.Request(conn);
    await conn.connect();
    try {
        const result = await request.query(query);
        return result;
    } finally {
        conn.close();
    }
}

各种变化:

  1. 仅传递将要使用的参数
  2. 使用await来简化异步逻辑流程
  3. 连接后使用try / finally捕获任何错误,这样我们就可以始终关闭连接而不会泄漏连接
  4. var切换到const
  5. 使函数async以便在完成内部操作或发生错误时返回挂钩的promise

然后,如果您调整调用test3()方式以仅传递查询参数(因为已使用了所有参数),则在其他地方使用该函数都应该起作用。

您的代码正在执行此操作:

var result = await test3(req,res,query);

但是, test3()没有返回值,因此await没有任何作用。 await使用一个promise进行工作,而您没有返回与test3()内部的异步操作链接的promise。 这就是我上面所做的更改。

暂无
暂无

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

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