【问题标题】:AWS Dynamodb not fetching data synchronously by node jsAWS Dynamodb 没有通过节点 js 同步获取数据
【发布时间】:2018-05-30 07:20:31
【问题描述】:

我是 node js dynamo db 的新手,我编写了一个 node js sdk 来从 dynamodb 的表中获取一行。它正在正确但不是立即获取数据,为此我出错了

我的代码低于一个简单的代码

var AWS = require("aws-sdk");

var config = function(){

AWS.config.update({region: 'us-east-1'});

// Create the DynamoDB service object
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

var params = {
  TableName: 'tblConfigs',
  // Key: {
  //   "id" : {S: "1"},
  // }
  ExpressionAttributeValues: {
   ":v1": {
     S: "1"
    }
  },
  FilterExpression: "id = :v1",
};
var v;
var json = ddb.scan(params, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    v = data;
    // console.log(JSON.stringify(data.Item));
   // return JSON.stringify(data.Item);
  }
});
// if(v=="u")
// for(var i=0;)

v = v.Items[0];

// for()

var con = {
    "host": v.endpoint.S,
    "user": v.endpoint.username.S,
    "password": v.endpoint.password.S,
    "database": v.endpoint.database_name.S
};

return con;
}

我得到了以下错误

> config()
TypeError: Cannot read property 'Items' of undefined
    at config (repl:31:7)

因为 v 是未定义的,所以它给出了错误,但是当我在节点控制台中执行代码时 v 不是未定义的,它第一次给出未定义的下一次给出值

如下图

> v
{ Items:
   [ { password: [Object],
       stage: [Object],
       username: [Object],
       id: [Object],
       endpoint: [Object],
       database_name: [Object] } ],
  Count: 1,
  ScannedCount: 1 }

我怎样才能在一段时间后立即获取该行? dynamodb 有什么好的方法吗?

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    您遗漏了一件重要的事情:Javascript 执行是异步的。只要您不使用async/await 语法,您就必须“玩”这样的回调:

    var ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
    
    function loadConfig(callback) {
        var params = {
            TableName: 'tblConfigs',
            ExpressionAttributeValues: {
                ':v1': {
                    S: '1'
                }
            },
            FilterExpression: 'id = :v1'
        };
    
        ddb.scan(params, function (error, data) {
            if (error) {
                callback(error);
            } else {
                var item = data.Items[0];
                callback(null, {
                    'host': item.endpoint.S,
                    'user': item.endpoint.username.S,
                    'password': item.endpoint.password.S,
                    'database': item.endpoint.database_name.S
                });
            }
        });
    }
    
    loadConfig(function (error, configuration) {
        if (error) {
            console.log(error);
        } else {
            // Your connection logic (JUST AN EXAMPLE!)
            var connection = mysql.connect({
                host: configuration.host,
                user: configuration.user,
                password: configuration.password,
                database: configuration.database
            })
        }
    });
    

    顺便说一句。在 DynamoDB 中存储数据库配置不是一个好的解决方案,我建议查看AWS Systems Manager Parameter Store


    编辑

    给你一个简短的例子,async/await 语法是什么样子的

    var ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
    
    const loadConfig = async () => {
        const { Items } = await ddb.scan({
            TableName: 'tblConfigs',
            ExpressionAttributeValues: {
                ':v1': {
                    S: '1'
                }
            },
            FilterExpression: 'id = :v1'
        }).promise();
    
        const item = Items[0];
        return {
            'host': item.endpoint.S,
            'user': item.endpoint.username.S,
            'password': item.endpoint.password.S,
            'database': item.endpoint.database_name.S
        };
    };
    

    【讨论】:

    • 请自行调试...console.log(item);现在不知道回复很难判断
    • (node:34792) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'S' of undefined aernal/process/next_tick.js:228:7) (node:34792) UnhandledPromiseRejectionWarning: 未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝 ID:1)(节点:34792)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
    猜你喜欢
    • 2017-09-29
    • 2019-02-08
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多