node.js - 让 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;
})
}
});
}
});
解决方案
似乎您在这里有一些相互冲突的 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);
推荐阅读
- java - “'StoredProcController' 中构造函数的参数 0 需要一个名为 'oracleEntityManager' 的 bean,但无法找到”Spring Boot 应用程序
- python - 图表类:TypeError:__init__() 接受 1 个位置参数,但给出了 3 个
- r - 使用ggplot2在一定半径内绘制点之间的路径
- laravel - Laravel 8 为第三方发布 api
- python - 在 python 中使用 selenium 显示鼠标光标的方法
- ruby-on-rails - 为什么开发中的清洗会影响生产?
- python - 如何选择数据库的列以在 sklearn 中调用线性回归(OLS 和套索)
- python - 在 python 2.7.9 上安装 nltk 库它不起作用
- r - 使用 R 中读取的 CSV 文件中的列数据
- javascript - 如何检查数组索引是否不等于参数?