3

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

2
  • 1
    Your getResult function doesn't return anything. Commented Aug 23, 2018 at 12:04
  • @ChrisG Thank you, that was very silly on my part Commented Aug 23, 2018 at 12:09

1 Answer 1

7
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.
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for your help. The code worked after I actually returned something at the end. Your edition is insightful but didn't work due to the rows not being recorded.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.