Search code examples
javascriptnode.jsexpressasynchronousnode-mysql

How do we use Async, and what is the best way in nodeJS


I'm trying to pass a query to my database, then send the result to my client side, but it looks like the request is async, because my request happens after that my post request returns the value.

How do I set an await for request?

My database connection

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'my_password',
    database: 'MEETME'
});

connection.connect(function(err) {
    if (err) {
        console.log("error while connecting to database");
        console.log(err.code);
    }
});

// function that query database <-------

function queryDatabase(userQuery) {
    connection.query(userQuery, function(err, result) {
        if (err) {
            throw err;
        }
        console.log("before");
        return result;
    });
}

and this is my post request

//POST
app.post('/signin', function(request, response) {
    var query = queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
    console.log(query);
    console.log("after");
    response.end(query, 200);
});

the result in the console is:

undefined
after
before

Solution

  • Change the implementation of queryDatabase function to return a promise. Any function that returns a promise can be awaited.

    function queryDatabase(userQuery){
         return new Promise((resolve,reject) => {
            connection.query(userQuery, function(err, result){
                if(err){
                  reject(err);
                }
                console.log("before");
                resolve(result);
            }); 
         }); 
    }
    
    
    
    app.post('/signin', async function(request, response){
        var query = await queryDatabase("SELECT EMAIL FROM MEMBER WHERE ID_MEMBER = 3");
        console.log(query);
        console.log("after");
        response.end(query, 200);
    });