Как заставить узел ждать разрешения AWS для разрешения? - PullRequest
0 голосов
/ 05 апреля 2019

Попытка получить доступ к корзине S3 из экспресс-приложения node.js.Я пытаюсь вернуть файл JSON из корзины в форме объекта JSON.Вот код:

    let gets3 = function(file) {
        devs3();
        return new Promise(function(resolve, reject)  {
            var params = {
                Bucket: S3_BUCKET,
                Key: file
            }
            var s3 = new aws.S3();
            try {
            s3.getObject(params, function(err, data) {
                var myfile = JSON.parse(data.Body.toString());
                resolve(myfile);
            });
            } catch (err) {
                reject(err);
            }
        });
    }


module.exports = {


    fetchEvents : function(cata) {
        var myJson;
        switch (cata) {

            case "Pr":
                myJson = 'primaryEvents.json';

            case "Sc":
                myJson = 'secondaryEvents.json';

            case "Po":
                myJson = 'postEvents.json';
        }

        let gets3init = gets3(myJson);

        gets3init.then(function(file) {
            console.log('From Fetch Events: ' + JSON.stringify(file));
            return file;
        });

    }
}

devs3 () просто устанавливает информацию для входа в S3 и запускает aws.config.setPromisesDependancy.В моем основном app.js я запускаю fetchEvents («Pr»), а затем пытаюсь отобразить его.В моей консоли он успешно отображает содержимое файла json, однако приложение существует с ошибкой типа: cannot read property 'n' of undefined, где n - имя первого элемента в файле Json.Следует отметить, что эта ошибка отображает в консоли перед тем, как печатается файл JSON, показывая, что функция не ожидает завершения get3 и возврата файла.Есть ли способ заставить приложение ждать (это происходит при загрузке страницы) обещания разрешить?

1 Ответ

0 голосов
/ 05 апреля 2019

Спасибо @Bergi за то, что указали мне правильное направление и помогли мне получить этот ответ.По сути, я использовал неправильные обещания с самого начала.Мне нужно было вернуть обещание из функции fetchEvents, а не данные, а затем использовать это в коде вызова, чтобы продолжить выполнение только после разрешения обещания.
fetchEvents

module.exports = {


    fetchEvents : function(cata) {
        var myJson;
        switch (cata) {

            case "Pr":
                myJson = 'primaryEvents.json';
                break;

            case "Sc":
                myJson = 'secondaryEvents.json';
                break;

            case "Po":
                myJson = 'postEvents.json';
                break;
        }

        return gets3(myJson);

    }
}

Телефонный код

app.get('/PrEvents', function(req, res) {
    var myCata = req.path.replace('Events', '').replace('/', '');
    fetch(myCata).then(function(events) {
      res.render('pages/eventsShowTemp', {
        console.log(events);
      });
    });
  });
...