2016-05-21 36 views
2

私はNodeJSを初めて使用しています。私は次のスニペットを持っています。NodeJS mysqlとの非同期は私を混乱させます

var connection = mysql.createConnection(dbConfig); 

connection.connect(function(err) { 
    if (err) 
     console.log("MySQL Connection Error: ", err); 
    else 
     console.log("Connection successfully established"); 

}); 

connection.query("SELECT * FROM `members1617`;",function(err,rows) { 
    if (err) 
     console.log("err: ", err); 
    else 
     console.log("rows: ",rows); 

    connection.end(); 
}); 

このコードは悪いですか? connection.connect()が終了し、クエリがアクティブ化される前に接続が確立されているという保証がないためだと思います。そしてidは、接続が行われる前にクエリが呼び出されているので、あらゆる種類のエラーが発生します。ここでは非同期はどのように機能していますか?

答えて

2

普及しているnode-mysqlライブラリの単純なクエリビルダラッパーであるknexを使用することをお勧めします。

knexを初期化した後、オブジェクトはデータベースへの接続プールです。そのオブジェクトには、クエリを実行するために連鎖された関数があります。クエリは約束を返し、接続が正しく行われたときにのみ実行されます。 Knexが自動的にこれを行います。それはそれと同じくらい簡単です

function getMembers(){ 
    return knex.select().from('members1617') 
    .then(rows => return rows) 
    .catch(err => console.log(err)) 
} 

あなたのコードは次のようになります。

また、約束や約束を適切に処理できるように、Bluebirdなどの約束ライブラリを使用することをお勧めします。

knexまたはnode-mysqlを使用するかどうかにかかわらず、ノードで非同期の制御フローを処理するために約束またはジェネレータを使用する方法を学ぶことを強くお勧めします。あなたの自由に利用できるチュートリアルやブログがいくつかあります。

+0

async.jsをお勧めしますか? –

+0

自分自身で非同期を使用していません。 async/await機能は、ES 7のjavascript言語にネイティブで提供されるはずです。異なるライブラリをどのように使用するかを理解する以外の理由で、非同期コードを処理するさまざまな方法を学ぶのは苦労しません。約束は非常に普及しているので、あなたが一日光っていれば、それはあなたに何日かかかります。 –