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

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

问题在于,variables由于fire.and忘记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调用都是asynchronous的,因此如果将它们运行到“常规”for循环中,则会同时将所有调用发送到数据库,这可能会触发一些配额。 下面的代码一次发送一个查询(通过等待直到一个呼叫完成来呼叫下一个呼叫)。 您也可以同时发送一些查询(使用类似于本文中显示的批处理技术)。

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