2012-02-22 11 views
0

以前私はPHP開発者でしたので、この質問はあなたの中には馬鹿馬鹿しいかもしれません。ノードjs:リクエストにmysqlの結果を割り当てます。

私はノードjsでmysqlを使用しています。

client.query('SELECT * FROM users where id="1"', function selectCb(err, results, fields) { 
    req.body.currentuser = results; 
    } 
); 
console.log(req.body.currentuser); 

Iは、関数外にそれを使用する可変(req.body.currentuser)(結果)結果セットを割り当てることを試みたが、それは動作していません。

私にそれを回避する方法を教えてもらえますか?

答えて

1

クエリ呼び出しは非同期です。そのため、selectCbはあなたのconsole.logコールより後の時点で実行されます。電話番号console.logselectCbに登録すると、それが機能します。

一般に、selectCbコールバックからクエリの結果に依存するすべてを呼び出す必要があります。 Node.JSの基本的なアーキテクチャ原則の1つです。

+0

いいえ、私は機能の外でそれが必要です。あなたが理解できるようにconsole.logを追加しました。しかし、実際にはclient.queryは関数で記述されており、値を返す必要があります。 –

+0

@Vasanthは、あなたがあなたのアーキテクチャを変更して、機能の外でそれを必要としないようにしたいと言っています。それはnode.JSの仕組みです。 –

+0

ご返信ありがとうございます@ペッカ –

1

client.queryの呼び出しは、node.jsのほぼすべてのものと同様に、という非同期のです。つまり、メソッドは要求を開始するだけですが、実行は続行されます。したがって、console.logに到達すると、まだreq.body.currentuserに何も定義されていません。

あなたは、コールバック内のコンソールログを移動した場合、それは動作します見ることができます:

client.query('SELECT * FROM users where id="1"', function selectCb(err, results, fields) { 
    req.body.currentuser = results; 
    console.log(req.body.currentuser); 
}); 

ですから、この要件の周りにあなたのコードを構築する必要があります。イベント駆動の関数型プログラミング(これはこれである)は、最初はあなたの頭を包み込むのが難しい場合があります。しかし、一度それを得ると、それは多くの意味があります。

+0

いいえ、私は機能の外にそれが必要です。あなたが理解できるようにconsole.logを追加しました。しかし、実際にはclient.queryは関数で記述されており、値を返す必要があります。 –

+1

@VasanthV、残念ながら、*コールバックの外側にアクセスする方法はありません。 node.jsの基本的な設計原則です。これを回避するにはコードを再構築する必要があります。 –

関連する問題