2

複数の SQL クエリを実行しようとしています。

問題は、node.js の使用を忘れてしまうため、変数がスコープ外に出続けることです。awaitC#のキーワードに似た方法を見つけようとしています。

これが私の壊れたコードです。これにより、私が達成しようとしていることをより明確にする必要があります。

function getTopicsForMessages(request, results)
{
    //Get topics for this message
    var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri";
    queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes";
    queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)";
    queryString += " WHERE messageId = ?";

    for (var i = 0; i < results.length; i++)
    {
        mssql.query(queryString, [results[i].id],
        {
            success: function (topicsResults)
            {
                results[i].topics = topicsResults;
            },
            error: function (err) {
                console.error("SQL Read error: " + err);
                request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read");
            }
        });
    } 
    //Continue... once all queries have executed successfully.
}

これは、ノードのやり方をよく知らないという問題だと思います。

await キーワードに似たものを許可する Node.js のいくつかのパッケージ/オプションについて読みましたが、Azure Mobile Services を使用しているため、それらを実際に使用できるかどうかはわかりません。

また、SQLでこのクエリをよりうまく実行できると確信しています。しかし、繰り返しますが、私はその方法がよくわかりません。

よろしくお願いします。

ダニー

4

1 に答える 1

0

以下のコードは、可能な実装の 1 つを示しています。node.js のすべての DB 呼び出しは非同期であるため、それらを「通常の」for ループに実行すると、すべての呼び出しが同時に DB に送信され、クォータがトリガーされる可能性があります。以下のコードは、クエリを一度に 1 つずつ送信します (1 つの呼び出しが完了するまで待って次の呼び出しを呼び出します)。一部のクエリを並行して送信することもできます (この投稿で示したバッチ処理手法に似たものを使用します)。

function getTopicsForMessages(request, results)
{
    //Get topics for this message
    var queryString = "SELECT ripple_messenger.TopicTypes.name, ripple_messenger.TopicTypes.imageUri";
    queryString += " FROM ripple_messenger.MessageTopics JOIN ripple_messenger.TopicTypes";
    queryString += " ON (ripple_messenger.MessageTopics.topicId = ripple_messenger.TopicTypes.id)";
    queryString += " WHERE messageId = ?";

    var queryNextItem = function(i) {
        if (i >= results.length) {
            // All done
            continuation();
        } else {
            mssql.query(queryString, [results[i].id],
            {
                success: function (topicsResults)
                {
                    results[i].topics = topicsResults;
                    queryNextItem(i + 1);
                },
                error: function (err) {
                    console.error("SQL Read error: " + err);
                    request.respond(statusCodes.INTERNAL_SERVER_ERROR, "SQL Query failed on read");
                }
            });
        }
    }

    queryNextItem(0);

    function continuation() {
        //Continue... once all queries have executed successfully.
    }
}
于 2014-07-25T21:45:42.377 に答える