Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js Using async/await with mysql

I've been trying to use async/await with MySQL in node but it returns an undefined value each time. Is there a reason why? Please find my code below.

const mysql = require('promise-mysql');

    var connection;

    const dbConfig = {
        host: "hostname",
        database: "dbname",
        user: "username",
        password: "passwords"
    };

    async function getResult(){

        await mysql.createConnection(dbConfig).then(function(conn){

            connection = conn;
            var result = connection.query('select height from users where pin=1100');

            return result;

        }).then(function(rows){
            console.log(JSON.parse(JSON.stringify(rows[0].height)));
            connection.end();
            return rows[0].height;
        }).catch(function(error){
            if (connection && connection.end) connection.end();
            //logs out the error
            console.log(error);
        });
    }


    async function queryDb(){

        try{

         var height = await getResult(); 
        console.log(height);
         if(height){
            console.log(height)
         }

        }catch(err){
            console.log(err);
            console.log('Could not process request due to an error');
            return;

        }
    }

    queryDb();

I expect the height to be returned in queryDb, however, the value is only shown in the getResult function and not returned to be used in the queryDb function.

I know the code may not be perfect as I'm new to node and I've been trying to find alternative ways to do this but

like image 552
Jay Avatar asked Mar 07 '26 02:03

Jay


1 Answers

async function getResult(){

    let connection;
    try {

      connection = await mysql.createConnection(dbConfig);
      const result = await connection.query('select height from users where pin=1100');

      console.log(result[0].height);
      return result[0].height;

    } finally {
      if (connection && connection.end) connection.end();
    }

}

Fixes the following problems:

  1. If you can use async/await, it's pointless to still use then for these situations..
  2. You don't need to JSON stringify and parse if you're logging something.
  3. If you catch an error to close a connection, you really should rethrow it so the function that calls getResult doesn't get garbage/undefined back. Instead of rethrowing it, I just added a finally block that always closes the connection, whether it was successful or not.
  4. Since you're using async/await, your javascript engine should support let and const. It's better than var =)
  5. You weren't returning anything.
like image 127
Evert Avatar answered Mar 09 '26 14:03

Evert