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

Run multiple MSSQL queries in node.js

本文关键字:MSSQL 查询 运行 node js      更新时间:2023-09-26

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

问题是,由于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移动服务。

我也确信我可以在某种程度上做这个查询更好的SQL。但是,我也不太确定怎么做。

提前感谢,

丹尼

下面的代码显示了一种可能的实现。由于node.js中的所有DB调用都是异步的,如果您将它们运行到"常规"for循环中,您将同时发送所有调用到DB,这可能会触发一些配额。下面的代码一次发送一个查询(等到一个调用完成后再调用下一个)。你也可以并行发送一些查询(使用类似于这篇文章中展示的批处理技术)。

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