首页 > 解决方案 > 在nodejs中的同一连接内运行查询

问题描述

在使用代码片段中提到的空间中的第一个查询( query1 )的结果构建它之后,需要运行第二个 sql 查询(query2 ) ,第二个 sql 查询将根据第一个查询的结果生成。但是当我尝试运行它时,它会毫无问题地构建第二个查询,但它没有执行。有人可以帮助纠正这个问题。

let userNames ="'";
let query1="SELECT * FROM user WHERE userid in ('1','2','3','4')"

conn.connect().then(function(){
    let req1=new sql.Request(conn);
    req1.query(query1).then(function(recordset){            
        recordset.recordset.map((item)=>{
            userNames=userNames.concat(item.user_name+"','");
        })
        userNames=userNames.slice(0, -2);
                 
        query2=`SELECT * FROM INVOICEMASTER WHERE username IN (${userNames})`
        
        console.log('----------------------------------')   

            **//// Need to execute query2 here**
            
        console.log('before closing the con')
        conn.close();
        console.log('after closing the con')       
    })
    .catch(function(err){
        console.log(err)
        conn.close();
    });
})
.catch(function(err){
    console.log(err);
});

标签: javascriptnode.jscallback

解决方案


Node.js 是异步的,因此每个函数调用都将单独执行,而所有其他函数调用都将执行而无需等待前面的函数。

所以当你执行时:

req1.query(query2).then((data)=>{
     ** process your data **
});

conn.close();

查询将在单独的线程中执行,但事件循环将继续并关闭连接。

解决方案将:

  1. 异步等待

    req1.query(query1).then(async function(recordset){            
         recordset.recordset.map((item)=>{
             userNames=userNames.concat(item.user_name+"','");
         });
         userNames=userNames.slice(0, -2);
    
         query2=`SELECT * FROM INVOICEMASTER WHERE username IN (${userNames})`;
    
         var query2Data = await req1.query(query2);
    
         ** process query2Data here **
    
         conn.close();
    
    });
    
  2. 在第二个查询执行回调函数中关闭 SQL 连接。

    req1.query(query1).then(async function(recordset){            
         recordset.recordset.map((item)=>{
             userNames=userNames.concat(item.user_name+"','");
         });
         userNames=userNames.slice(0, -2);
    
         query2=`SELECT * FROM INVOICEMASTER WHERE username IN (${userNames})`;
    
         req1.query(query2).then( function(data){
    
             ** process query2Data here **
             conn.close();
         });
    
    });
    

推荐阅读