web-dev-qa-db-ja.com

mysqlでasync / awaitを使用するNode.js

MySQLでasync/awaitをノードで使用しようとしていますが、毎回未定義の値を返します。理由はありますか?以下の私のコードを見つけてください。

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();

高さはqueryDbで返されると思いますが、値はgetResult関数でのみ表示され、queryDb関数で使用するために返されません。

私はノードが初めてなので、コードが完全ではない可能性があることを知っています。

3
Jay
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();
    }

}

次の問題を修正します。

  1. Async/awaitを使用できる場合は、これらの状況でthenを使用しても意味がありません。
  2. 何かをログに記録する場合は、JSON stringifyおよびparseを使用する必要はありません。
  3. エラーをキャッチして接続を閉じた場合、getResultを呼び出す関数がガベージ/ undefinedを返さないように、実際に再スローする必要があります。再スローする代わりに、成功したかどうかにかかわらず、常に接続を閉じるfinallyブロックを追加しました。
  4. Async/awaitを使用しているため、JavaScriptエンジンはletおよびconstをサポートする必要があります。 varより良いです=)
  5. あなたは何も返さなかった。
6
Evert