2016-09-18 9 views
0

私は現在、プライベートメッセージシステムのバックエンドAPIを作成しています。非同期呼び出しの応答を非同期呼び出しの外部で使用するために変数に保存する必要があります。mysqlクエリの応答を変数に保存して後で使用できるようにする

私はさらに説明する前にコードを提示します:

app.get("/api/users/:UserID/messages/deletemessage/:MessageID", function(req, res){ 

    var messageID = parseInt(req.params.MessageID); 
    var message = null; 

    connection.query("SELECT * FROM Message WHERE MessageID = ?", messageID, function(err, resp){ 
     if(!err){ 
      message = resp[0]; 
     } 
    }); 
    console.log(message); 
    //continue using the message variable here to perform more functionality... 
}); 

あなたは、私はmysqlデータベースの選択クエリの応答にmessage変数を割り当てるしようとして見ることができます。

この機能を実行すると、nullが画面に印刷されます。私はなぜこれが起きるのか知っています。なぜなら、データベースへのクエリが完了する前にconsole.logステートメントが呼び出されたからです。

私の質問は、データベースクエリの範囲外でメッセージ変数を使用するにはどうすればこの問題を解決できますか?

私は働いてなかった、これを試してみた:

app.get("/api/users/:UserID/messages/deletemessage/:MessageID", function(req, res){ 

    var messageID = parseInt(req.params.MessageID); 
    var message = null; 

    connection.query("SELECT * FROM Message WHERE MessageID = ?", messageID, function(err, resp){ 
     if(!err){ 
      connection.end(); //try to end the connection so hopefully it assigns 
      message = resp[0]; 
     } 
    }); 
    console.log(message); 
    //continue using the message variable here to perform more functionality... 
}); 
+0

他に何かをする前に結果を待つようにコードを修正しないでください。 – adeneo

+0

@adeneoには、「それをコーディングする」という一般的な方法がありますか?すぐに結果を使用する必要がある場合はどうすればよいですか?待っている方法はありますか? – JavascriptLoser

+0

確かに、コールバックを使用するか、結果を待つという約束を実装します。どのように問題を解決するかは、返されたデータをどのように使用しているか、すぐに*する必要がある理由によって異なります。 – adeneo

答えて

0

のNode.jsであなたがmessage変数が割り当てられているクエリ機能、ログにステートメントを移動する必要があると思います。

ノードは、ログに記録する前にそのクエリが実行されるのを待つことはありません。ノードはデータをある場所から別の場所にパイプするだけで、その非同期言語のために実際には待機したりロックしたりすることはありません。

したがって、別の機能や別の機能を別の機能と呼び、別の機能と別の機能を呼び出すことがあります。それはcallback hellと呼ばれています。

今日は外出する方法があり、今日では多くが標準になっています。コールバック関数は本当に面倒な結果になり、コールバック地獄に陥るので、代わりにPromise ChainsまたはYield expressionsを使用してください。

出力式はジェネレータ関数で機能します。そのNode.jsのは、デフォルトでは発電機の機能を解釈しませんが、心の中で

function*() { 
    // generator function 
    // you can use the "yield" keyword here 
} 

ちょうど裸:彼らはこのようなfunction*と基本的には定期的な機能です。 coのようなモジュールを使う必要があります。

coは使いやすいです。ジェネレータ関数をco関数の中に置くだけで動作します。このように:

var co = require('co'); 

app.get("/api/users/:UserID/messages/deletemessage/:MessageID", function(req, res){ 
    co(function*() { 
     var messageID = parseInt(req.params.MessageID); 

     var resp = yield connection.query("SELECT * FROM Message WHERE MessageID = ?", messageID); 
     // NOTE THE YIELD^

     var message = resp[0]; 
     console.log(message); 
    }); 
}); 

降伏式と発電機能についての心の中で裸にするいくつかのこと:

  • coだけである

    var co = require('co'); 
    
    co(function*() { 
        // you can yield here 
    }); 
    

    だからあなたのコードは次のようになります。ジェネレータ関数インタプリタを使用すると、ノードv6.xはジェネレータ関数をそのまま使用できるように解釈しますので、必要ではありません。

  • データベースと降伏式を使用する他のモジュールのために行くcoまたはhttps://www.npmjs.com/package/mysql-promiseのような約束と同じにサポートするものを使用してデータベースモジュールを交換する必要がありますつもりだ照会し、彼らが約束またはco
  • をサポートしている場合、あなただけの彼らの結果を得ることができます
  • express.jsにはジェネレータのサポートを追加するためにcoを使用する必要がありますが、app.getの機能をジェネレータ機能に置き換えるKoaという別のWebフレームワークがあります。したがって、リクエスト関数の内部で直接生成することができます。
関連する問題