【问题标题】:Javascript Asynchronous Database QueriesJavascript 异步数据库查询
【发布时间】:2017-12-17 13:28:27
【问题描述】:

我对 AWS 数据库、Node.JS 和 Express 完全陌生。我需要对 AWS dynamodb 数据库进行多次查询(将所有 device_id 计数相加并遍历所有 bin)。我在下面有我的代码。查询参数逻辑不完整,但我什至不知道从哪里开始异步逻辑编译并将查询返回到我的 API 中的输出。

我尝试了嵌套循环,但很快意识到逻辑错误,因为所有数据库调用都是异步的。我尝试使用 async.map() 但不知道如何完成它。我是否应该重复我对 deviceIds 的 async.map() 所做的操作,但将其嵌套在 bin 中?那么如何将内部 async.map() 值返回到外部呢?或者有没有更优雅的方式来做到这一点,我什至没有想到?

如果有人对此有任何额外的资源和/或基本框架的描述,我将不胜感激。

谢谢!

var getCoffeeHistogram = function() {
  var counts = [];
  var bins = fillRange(16);
  var deviceIDs = fillRange(18);

  var i;
  for (i = 0; i < 16; i++) {
    async.map(
        deviceIDs,
        function(deviceID, callback) {
            var param = {
                TableName: "iot-coffeecounts",
                ExpressionAttributeValues: {
                    ':id': "" + deviceID,
                    ':time': "1"
                },
                ExpressionAttributeNames: {
                    "#ts": "timestamp"
                },
                KeyConditionExpression: "device_id = :id and #ts > :time"
            };

            docClient.query(param, function(err, data) {
                if (err) {
                    console.log("Unable to query. Error:", JSON.stringify(err, null, 2));
                } else {
                    console.log("Querying Succeeded for device");
                }
                callback(null, data.Count);
            });

        },
        function(err, coffeeCounts) {
            console.log(function(coffeeCounts) {
                var total = 0;
                for (count in coffeeCounts) {
                    total = total + count;
                }
                return total;
            });
        }
    );
  }
};

【问题讨论】:

  • Promises 和 ES6 await/async 是当今驯服异步代码的最简单方法。

标签: javascript node.js amazon-web-services express asynchronous


【解决方案1】:

您可以使用 dynamodb 中的 batchGet 方法在单个查询中返回所有设备 ID 的结果,而不是循环遍历设备 ID 并发出多个查询(这非常低效)。

您只需要根据文档构建具有所有设备ID的查询对象并发出查询即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2017-09-20
    • 2012-10-24
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多