首页 > 解决方案 > 让 node.js 应用程序从 AWS S3 存储桶中提取多个页面时遇到问题(超过 1000 个文件)

问题描述

我继承了一个 node.js 应用程序,我试图通过修复我们的问题来伪装自己的方式。在我们达到 AWS 存储桶的 1000 个文件页面限制之前,一切都运行良好。我曾尝试使用 .eachPage() 标准和异步进程以及使用 .hasNextPage() 进程,但无法使其正常工作。我觉得我的尝试,这个版本是最接近工作的。在我看来,这似乎是有道理的,但它只提取了前 1000 个文件。有人可以帮我指出正确的方向来加载那些额外的数据页面吗?

// Get file list from AWS s3
        s3.listObjects({
            Bucket: config.aws.s3.bucket
        }).eachPage(function(error, data, done) {
            console.log('S3 Data', data);
            done();
            if (error) {
                var err = new Error('Couldn\'t retrieve file list.');
                err.status = 404;
                return next(err);
            } else {
                return res.render('user/home', {
                    userName: user.firstName + ' ' + user.lastName,
                    dummy: (new Date()).getTime(),
                    products: util.parseProductMetaData(config.subscriptions),
                    weeks: util.parseS3FileList(user.subscriptions,
                        data.Contents,
                        config.aws.s3.worksheetFolder,
                        config.subscriptions,
                        config.aws.s3.fileRegex),
                    userHeaderContext: {
                        loggedIn: true
                    },
                    city: user.city,
                    state: user.state,
                    userFormContext: {
                        disabled: true,
                        _id: user._id,
                        email: user.email,
                        firstName: user.firstName,
                        lastName: user.lastName,
                            return val;
                        })
                    }
                });
            }
        });

标签: node.jsamazon-s3

解决方案


似乎您在这里有一些相互冲突的 JS 概念。当您使用带有三个参数的异步样式时,只要您调用done()下一页就会执行——因为您立即执行此操作,下一页将立​​即开始执行,因此对于以后的某些内容没有任何意义return

您还调用res.render()了文件的每一页,这可能不是您想要的,为什么看起来只列出了 1000 个文件(实际上您渲染了前 1000 个文件,然后在发送结果后继续在后台做大量工作! )。我会推荐如下内容:

var files = [];
s3.listObjects({
  Bucket: config.aws.s3.bucket
}).eachPage(function(error, data){
  if(err) return;
  files.push(data.Contents);
});

// Now do something with all the files
res.render('whatever',files);

推荐阅读