Значения, возвращаемые из AWS DynamoDB JavaScript SDK, не определены

В настоящее время я использую JavaScript AWS SDK для DynamoDB и пытаюсь проанализировать данные, которые я получаю от вызова DynamoDB, но он всегда возвращает undefined. Результат печатается успешно, но попытка сохранить эти данные в переменной безуспешна. Ниже я пытаюсь это сделать.

const AWS = require("aws-sdk");
AWS.config.update({ region: "us-east-1" });
const dynamoDb = new AWS.DynamoDB({ apiVersion: "2012-08-10" });

const promisify = foo =>
  new Promise((resolve, reject) => {
    foo((error, result) => {
      if (error) {
        reject(error);
      } else {
        resolve(result);
      }
    });
  });

const params2 = {
  TableName: "Users",
  Key: {
    userID: { S: "123456789" },
  },
};

const test = params => {
  dynamoDb.getItem(params, function(err, data) {
    if (err) {
      console.log("Error", err);
    } else {
      console.log("Success", data.Item);
      return data.Item;
    }
  });
};

let user = test(params2);
console.log("User:", user);

Я считаю, что это связано с асинхронностью getItem, и я исследовал, как реализовать обещание в этом коде, но не могу получить правильный синтаксис. Любая помощь приветствуется. Спасибо.


person dmoini    schedule 01.12.2019    source источник
comment
Я думаю, что происходит то, что Lambda вызывает функцию, но она не будет ждать обратного вызова, поэтому думает, что это сделано, и завершает работу. Вы можете поделиться полным кодом?   -  person Amit Baranes    schedule 01.12.2019
comment
@AmitBaranes Только что добавил полный код.   -  person dmoini    schedule 01.12.2019
comment
Взгляните на мой ответ здесь: stackoverflow.com/a/58158967/9931092   -  person Amit Baranes    schedule 01.12.2019
comment
Функции promises / async не работают так, если вы не используете async / await. обещания не имеют возвращаемого значения, вам нужно делать что угодно со значением в обратном вызове обещания   -  person bryan60    schedule 01.12.2019


Ответы (1)


Проблема в том, что вы ничего не возвращаете из своей test функции. Так что ожидается, что вы получите undefined снаружи.

Попробуйте сделать это так:

// used aws promise api https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html
function test(params) {
    return dynamoDb.getItem(params).promise();
}

test(params2).then(
    user => {
        console.log('User:', user);
    },
    error => {
        console.log('Error:', error);
    },
);

Читайте дальше:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

person Ulan Murzatayev    schedule 01.12.2019