越来越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);
越来越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);