【问题标题】:How do I force node to wait for aws promise to resolve?如何强制节点等待 aws promise 解决?
【发布时间】:2019-08-27 10:21:07
【问题描述】:

尝试从 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 完成并返回文件。是否有强制应用程序等待(这发生在页面加载时)以解决承诺?

【问题讨论】:

  • 您的fetchEvents 必须返回一个承诺,以便其调用者可以等待它。不,你不能阻止它。
  • 对不起,我很困惑你的意思@Bergi。 “阻止它”是什么意思?
  • “阻塞”的意思是“强制同步等待”。你不能那样做。
  • 哦,好的。有没有什么方法可以确保代码等待s3.getObject() 执行它的回调?
  • 您的代码then 回调中的console.log('From Fetch Events: ' + JSON.stringify(file));)已经确实等待s3.getObject()。但是fetchEvents() 本身并没有返回一个承诺,所以它的调用者不能等待。更改它,然后更改调用代码。

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


【解决方案1】:

感谢@Bergi 为我指明了正确的方向并帮助我得到了这个答案。本质上,我从一开始就错误地使用了 Promise。我需要从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);
      });
    });
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2018-11-28
    相关资源
    最近更新 更多