3

私はnodejsを初めて使用し、MySQLデータベースにクエリを実行して特定のuser_idからユーザー名を返す必要があるコードを書いています。私はあなたのすべての関数が非同期であるべきだと読んでいます。この場合、理想的には、このクエリの実行中にサーバーが他のイベント リクエストに応答できるようにしたいと考えています。ただし、これは特に大きなクエリではなく、単一の値のみを返します。多分私はそれを同期にするべきですか?(それがあなたの答えなら、それを変更するサンプルコードは素晴らしいでしょう) とにかく、ここに私の関数があります。最後の行「return current_username;」の近くでエラーが発生します。current_username はその時点で定義されていないためです。助言がありますか?

function get_current_username(current_user_id) {
    console.log(' | Entered get_current_username');
    sqlq = 'SELECT username FROM users WHERE id = ' + current_user_id;
    connection.query(sqlq, function(err, rows, fields) {
      if (err) throw err;
      var current_username = rows[0].username;
      console.log(' | the current_username =' + current_username);        
    });

return current_username;

}

4

1 に答える 1

8

にコールバック関数を渡し、 のコールバックget_current_username内からそのコールバック関数を呼び出しconnect.queryます。

function get_current_username(current_user_id, callback) {
    console.log(' | Entered get_current_username');
    sqlq = 'SELECT username FROM users WHERE id = ' + current_user_id;
    connection.query(sqlq, function(err, rows, fields) {
      if (err) throw err;
      var current_username = rows[0].username;
      console.log(' | the current_username =' + current_username);        
      callback(current_username);
    });
}

この関数を使用する場合は、次のようにします。

get_current_username(12345, function(username) {
   console.log("I am " + username);
});

promises/futures の使用を確認することもできます。これらの正義について説明することはできないと感じているので、このStackOverflow question about Understanding Promisesにリンクします。

ただし、これはアーキテクチャ上の決定です。特にサードパーティによる再利用を目的としたモジュールを作成する場合は、コールバックを使用することを好む人もいます。(そして実際、Promise のようなものを採用する前に、ここでの学習段階でコールバックについて頭を完全に理解するのがおそらく最善です。)

于 2013-04-13T00:23:02.703 に答える