connection.query()返回值不能在函数外重复

6ie5vjzr  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(283)
function getData(callback){
    const sql =`INSERT INTO receipiant (name, address ,bloodgroup,emailid ,phonenumber ) VALUES ('${name}','${address}','${bloodgroup}','${emailid}','${phonenumber}');SELECT bloodbank.name, donor.donname,donor.phoneno,donor.address,donor.emailid,donor.dateofbirth FROM bloodbank INNER JOIN donor ON donor.bbid=bloodbank.idbloodbank WHERE donor.bloodgroup = '${bloodgroup}'`
    connection.query(sql,(err,result)=>{
        if(err)
            callback(err,null)
        else
            callback(null,result)

    })
}
var msgres
getData(function(err,data){
    if (err) {
        // error handling code goes here
        console.log("ERROR : ",err);            
    } else {            
        // code to execute on data retrieval
        // console.log("result from db is : ",data); 
        var msgres = Object.assign({},data) 
    }    

});

  console.log(msgres)

数据被复制到函数的msgres变量中,msgres只在函数内显示,但当我尝试在函数外记录它时,它会显示未定义的值,但我已经在函数外声明了变量。我也尝试使用let关键字,但它仍然显示相同的值,但当我打开控制台时把它记录在函数中,它可以正常工作。

wi3ka0sx

wi3ka0sx1#

这是因为当您登录msgres时getdata还没有完成执行。
在node.js中,大多数i/o都是异步的,因此您将经常看到这种类型的问题。
最好的方法是将数据传递给回调中的处理函数。
你也不需要克隆返回的数据,只要把它传回去就行了!
例如:

function processData(data) {
    console.log("processData: processing: ", data);
    // do whatever with data here.
}

getData(function(err,data){
    if (err) {
        // error handling code goes here
        console.log("ERROR : ",err);            
    } else {            
         // code to execute on data retrieval
        console.log("result from db is : ",data);           
        processData(data);
    }    
});

相关问题