[Fixed] Wait for function to complete in Nodejs

Issue

I am trying to call a function inside my post API. I have multiple queries and want to wait for the function to complete in order to execute the next queries. I am having an issue here. The function isn’t completing the execution and the rest of the API gets executed as expected. How can I wait for the function to complete its execution? I have searched but couldn’t find something convenient and related to my code.

Here’s the code:

Node.js

function verifyEmail(mailToUpper)
{
var emailResult;

db2.open(mydbConnection, (err, conn) => {
if(!err)
{
    console.log("Connected Successfully");
}
else
{
  console.log("Error occurred while connecting to the database " + err.message);
}

conn.query(checkEmailQuery, [mailToUpper], (err, results) => {
  if(!err)
  {
    if(results.length > 0)
    {
      // res.write("Email already exists");
      emailResult = 0;
    }
    else
    {
      emailResult = 1;
    }
  }

  conn.close((err) => {
    if(!err)
    {
        console.log("Connection closed with the database");
    }
    else
    {
        console.log("Error occurred while trying to close the connection with the database " + 
                     err.message);
    }
  })
})
})
return emailResult;
}

router.post('/api/postData', (req, res) => {

 //some stuff
 var waitingForResult;
 setTimeout(() => {
   waitingForResult = verifyEmail(mailToUpper); 
 }, 2000)

console.log(waitingForResult); //throwing an error of undefined

if(waitingForResult === 1)  //not executing this
{
  //my other queries
}

else  //always executes this
{
  res.send("Email already exists");
}

});

Solution

function verifyEmail(mailToUpper) {
    return new Promise((resolve, reject) => {
        db2.open(mydbConnection, (err, conn) => {
            if (!err) {
                console.log("Connected Successfully");
            } else {
                console.log("Error occurred while connecting to the database " + err.message);
            }

            conn.query(checkEmailQuery, [mailToUpper], (err, results) => {
                if (!err) {
                    if (results.length > 0) {
                        // res.write("Email already exists");
                        resolve(0);
                    } else {
                        resolve(1);
                    }
                }

                conn.close((err) => {
                    if (!err) {
                        console.log("Connection closed with the database");
                    } else {
                        console.log("Error occurred while trying to close the connection with the database " +
                            err.message);
                    }
                })
            })
        })
    })
}
router.post('/api/postData', async (req, res) => {
  const waitingForResult = await verifyEmail( mailToUpper );
  if( waitingForResult === 1 ){
  //my other queries
  } else { 
  res.send("Email already exists"); 
  }
});

Leave a Reply

(*) Required, Your email will not be published