Как вернуть список очередей SQS в функции экспорта модуля? - PullRequest
0 голосов
/ 27 марта 2019

Я очень новичок в node.js, поэтому я думаю, что мне здесь не хватает чего-то очевидного.

Я просто пытаюсь получить список очередей SQS, используя aws-sdk, и вернуть их из модуля, чтобы они были доступны для другого кода. list_queues - это рассматриваемая функция.

Приведенный ниже код работает до некоторой степени, я вижу журнал «успеха» и журнал массива строк всех моих очередей, однако функция не возвращает этот массив вызывающей стороне, и я не понимаю, почему.

const AWS = require('aws-sdk');

AWS.config.update({region: 'eu-west-1'});
var sqs;
var sts = new AWS.STS();

sts.assumeRole({
  RoleArn: 'arn:aws:iam::xxxxx:role/UserRole',
  RoleSessionName: 'NodeDeveloperRoleSession'
}, function(err, data) {
  if (err) { // an error occurred
    console.log('Cannot assume role :(');
    console.log(err, err.stack);
  } else { // successful response
    console.log('Assumed role success :)');
    AWS.config.update({
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken
    });
    sqs = new AWS.SQS({apiVersion: '2012-11-05'});
  }
});

exports.list_queues = function() {
  sqs.listQueues({}, function(err, data) {
    if (err) {
      console.log("Error", err);
    } else {
      console.log("success");
      console.log(data.QueueUrls);
      return data.QueueUrls;
    }
  });
}

Любая помощь приветствуется

1 Ответ

4 голосов
/ 27 марта 2019
exports.list_queues = function() { // 2. but you actually want to return from this one 
  sqs.listQueues({}, function(err, data) { <-----------------
    if (err) {                                              |
      console.log("Error", err);                            |
    } else {                                                |
      console.log("success");                               | 
      console.log(data.QueueUrls);                          |
      return data.QueueUrls; // 1. you are returning from this one 
    }
  });
}

есть два способа заставить его работать

  1. Обещание на основе
exports.list_queues = function() {
  return sqs.listQueues({}).promise().then((data) => data.QueueUrls);
}

// and in another file you would:

const {list_queues} = require('./list_queues.js');
list_queues.then((queues) => console.log(queues));
  1. Обратный звонок на основе
exports.list_queues = function(cb) { // notice I added callback here
  sqs.listQueues({}, function(err, data) {
    if (err) {
      console.log("Error", err);
    } else {
      console.log("success");
      console.log(data.QueueUrls);
      cb(data.QueueUrls);
    }
  });
}

// and in another file you would:

const {list_queues} = require('./list_queues.js');

list_queues(function(queues) {
  console.log(queues);
});

Я настоятельно рекомендую вам использовать подход, основанный на обещаниях, так как он гораздо более читабелен, и вы можете использовать async/await, что отлично.

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