简体   繁体   中英

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM