如何强制节点等待AWS Promise解决?

时间:2019-04-05 13:35:15

标签: node.js json amazon-s3 promise aws-sdk

尝试从node.js Express应用程序访问S3存储桶。我正在尝试以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文件之前之前,此错误显示在控制台中,从而表明该函数没有等待gets3完成并返回文件。无论如何,是否有迫使应用程序等待(在页面加载时发生)等待诺言解决的问题?

1 个答案:

答案 0 :(得分:0)

感谢@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);
      });
    });
  });