Node.js Lambda Async return Undefined - PullRequest
       0

Node.js Lambda Async return Undefined

0 голосов
/ 01 января 2019

Простой вызов ec2 Описание групп безопасности и возврат идентификатора группы безопасности.Используя Async / await, но при регистрации возвращаемого значения я получаю неопределенное значение.Я полностью признаю, что я из Python, и я изо всех сил старался обернуть свой мозг вокруг асинхронных вызовов.Я думал, что это было прибито, но я явно что-то упускаю.

'use strict';

// Load Modules
const AWS = require('aws-sdk')

//Set the region
AWS.config.update({region: 'us-west-2'});

// Call AWS Resources
const ec2 = new AWS.EC2();

// Get Security Group ID From Event
const getSgIdFromEvent = async (event) => {
  var ec2params = { Filters: [{Name: 'tag:t_whitelist',Values[event['site']]}]};
  await ec2.describeSecurityGroups(ec2params, function (err, response) {
    if (err) {return console.error(err.message)}
    else {
      var sgId = response.SecurityGroups[0].GroupId;
      return sgId;
    };
  });
 };
// MAIN FUNCTION
exports.handler = (event, context) => {
  getSgIdFromEvent(event)
   .then(sgId => {console.log(sgId)});
}

"sgId" должен вернуть идентификатор группы безопасности.Перед возвратом он печатает нормально в исходной функции.

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Обычно, если это асинхронный вызов, вы хотите, чтобы он обрабатывался аналогично, без использования обратного вызова

// Load Modules
const AWS = require('aws-sdk')

//Set the region
AWS.config.update({ region: 'us-west-2' });

// Call AWS Resources
const ec2 = new AWS.EC2();

// Get Security Group ID From Event
const getSgIdFromEvent = async (event) => {
    var ec2params = { Filters: [{ Name: 'tag:t_whitelist', Values[event['site']]}] };
    try {
        const securityGroupsDesc = await ec2.describeSecurityGroups(ec2params).promise();
        const sgId = securityGroupsDesc.SecurityGroups[0].GroupId;
        //do something with the returned result
        return sgId;
    }
    catch (error) {
        console.log('handle error');
        // throw error;
    }
});
 };
// MAIN FUNCTION
exports.handler = (event, context) => {
    getSgIdFromEvent(event)
        .then(sgId => { console.log(sgId) });
}

, однако, если он не поддерживает асинхронный вызов, вы просто используете обратный вызов для обработки возвращаемых данных.или ошибка без использования асинхронной функции. Однако при чтении в документах AWS вы можете обнаружить, что функция ec2.describeSecurityGroups () возвращает запрос AWS , который имеет метод обещание () , который должен бытьВызван, чтобы отправить запрос и получить возвращенное обещание. Обратите внимание, что попытка перехвата здесь не нужна, но полезна в случае возникновения ошибки во время процесса.

0 голосов
/ 01 января 2019

Вот код, который работал с использованием async / await.Благодаря @Cristian Traina я понял, что ec2.describeSecurityGroups не возвращает обещание, оно возвращает AWS.Event.

// Get Security Group ID From Event
const getSgIdFromEvent = async (event) => {
  console.log('Getting Security Group ID')
  var params = { Filters: [{Name: 'tag:t_whitelist', Values 
   [event['site']]}]};
  const describeSG = await ec2.describeSecurityGroups(params).promise();
  return describeSG.SecurityGroups[0].GroupId;
 };

// Get Ingress Rules from Security Group
const getSgIngressRules = async (sgId) => {
  console.log(`Getting SG Ingress rules for ${sgId}`)
  var params = { GroupIds: [ sgId]};
  try{
    const ingressRules = await ec2.describeSecurityGroups(params).promise();
    return ingressRules;
  }
  catch (error) {
    console.log("Something went wrong getting Ingress Ruls");
  }
 };

// MAIN FUNCTION
exports.handler = (event, context) => {
  getSgIdFromEvent(event)
  .then(sgId => {return getSgIngressRules(sgId);}) 
  .then(ingressRules => {console.log(ingressRules);});
}

. Я отправил это как ответ сейчас, так как у меня есть функция getSgIdFromEvent,только 8 строк и все еще использую async/await, как я хотел.

Чего мне не хватало, так это .promise() в конце функции и возврата этого обещания.

Спасибо за все ответы!

0 голосов
/ 01 января 2019

Как я сказал в комментарии, есть вероятность, что describeSecurityGroups не вернет Promise.Попробуйте вместо этого явно преобразовать его в Обещание:

const promiseResponse = await new Promise((res, rej) => {
  ec2.describeSecurityGroups(ec2params, function (err, response) {
    if (err) {return rej(err.message)}
    else {
      var sgId = response.SecurityGroups[0].GroupId;
      res(sgId);
    };
  })
});

// promiseResponse is now equal to sgId inside the callback
return promiseResponse; // this will work because the function is async

Примечание. Вы можете удалить ключевое слово else

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...