AWS Dynamodb не получает данные синхронно по узлу js - PullRequest
0 голосов
/ 30 мая 2018

Я новичок в узле JS Dynamo DB. Я написал узел 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, я пытался, получить, getItem, сканирование, запрос все дают данные правильно, но не сразу ... Пожалуйста, предложите

1 Ответ

0 голосов
/ 30 мая 2018

Вам не хватает одной важной вещи: выполнение 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
        })
    }
});

Btw.Хранение конфигураций базы данных в 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
    };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...