运行 nodejs 中同一连接内的查询

Running a query inside the same connection in nodejs

需要 运行 第二个 sql 查询 (query2) 在使用第一个查询 ( query1) 在代码段中提到的space,第二个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);
});

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();
         });
    
    });
    

我可以使用下面的方法通过将函数调用包装到一个承诺中来实现这一点,然后使用 await 来获得结果,即使我正在寻找 运行 第一个查询中的第二个查询,使用这个这样我就可以构建第二个查询 运行 它。

这是张贴毛皮参考:

我可以使用等待函数等待结果

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

function usernamesGenerator(query, successCallback, errorCallback) {
        
        conn.connect().then(function(){
            let req1=new sql.Request(conn);
            req1.query(query).then(function(recordset){            
                recordset.recordset.map((item)=>{
                    userNames =userNames.concat(item.user_name+"','");
                })
                userNames=userNames .slice(0, -2);
                successCallback(userNames);  
                conn.close();                  
            })
            .catch(function(err){
                console.log(err)
                errorCallback(err);
                conn.close();
            });
        })
        .catch(function(err){
            console.log(err);
            errorCallback(err);
        });   
        
    }
    function usernamesGeneratorfunctionWrapper(query) {
        return new Promise((resolve, reject) => {
            usernamesGenerator(query,(successResponse) => {
                resolve(successResponse);
            }, (errorResponse) => {
                reject(errorResponse)
            });
        });
    }
    async function runLogic() {
        try {
            const user_names = await usernamesGenerator(query1);
            console.log("Invoices2 in business logic: "+user_names);
            
            /* Bulding query 2 & executing it can be done here */
            let query2=`SELECT * FROM INVOICEMASTER WHERE username IN (${user_names})`
        
        } catch(error) {
            console.error("ERROR:" + error);
        }
    }
    
    runLogic();