在node.js中运行多个MSSQL查询

时间:2014-07-24 21:48:17

标签: javascript node.js azure-mobile-services node-mssql

我正在尝试运行多个SQL查询。

问题在于,由于fire.and-forget node.js的使用,变量会超出范围。我正在尝试研究如何在C#中执行与await关键字类似的操作。

这是我破碎的代码,原样;这应该让我更清楚我想要实现的目标:

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.
}

我认为这只是一个不太了解节点做事方式的问题。

我已经阅读了Node.js的一些软件包/选项,它们允许类似于await关键字的东西,但是我不确定在使用Azure移动服务时是否可以使用它们。 / p>

我也确信我可以在SQL中以某种方式更好地执行此查询。但同样,我不太确定如何。

非常感谢,

丹尼

1 个答案:

答案 0 :(得分:0)

下面的代码显示了一种可能的实现方式。由于node.js中的所有数据库调用都是异步的,如果将它们运行到“常规”for循环中,您将同时向数据库发送所有调用,这可能会触发一些配额。下面的代码一次发送一个查询(通过等待一个调用完成以调用下一个调用)。您还可以并行发送一些查询(使用与this post中显示的批处理技术类似的内容)。

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.
    }
}