快把我逼疯了。
我需要我的服务器下载100个相对较小的文件文件从S3 (最大2MB)。
它总是工作~95%的文件,但它阻止了最后6-8个文件。resolve和reject回调都不会被调用.
我试着并行下载文件..。
下面是代码,它在95%的情况下都能在技术上起作用:
let singleGetFromS3 = (bucket, fileName) => {
return new Promise((resolve, reject) => {
let extension = getFileNameExtension(fileName);
fs.stat(`./${fileName}`, (err, stat) => {
if (err === null) {
console.log(`${fileName} exists locally`);
resolve(fileName);
} else if(err.code === 'ENOENT') {
let params = {Bucket: bucket, Key: fileName};
let file = require('fs').createWriteStream(`./tmp-${fileName}`);
s3.getObject(params).createReadStream()
.on('error', (error) => { return reject(error); })
.on('end', () => {
fs.rename(`./tmp-${fileName}`, `./${fileName}`, reject);
return resolve(fileName);
})
.pipe(file);
} else {
reject(err);
}
});
});
};使用:
"aws-sdk": "^2.23.0",
node --version
v4.5.0发布于 2017-03-07 18:47:38
看起来您正在侦听错误的事件,以确定何时解决。当从S3的Readable中读取所有字节时,您不想解析,而是希望在file完成写入时解析。
let singleGetFromS3 = (bucket, fileName) => {
return new Promise((resolve, reject) => {
let extension = getFileNameExtension(fileName);
fs.stat(`./${fileName}`, (err, stat) => {
if (err === null) {
console.log(`${fileName} exists locally`);
resolve(fileName);
} else if(err.code === 'ENOENT') {
let params = {Bucket: bucket, Key: fileName};
let file = require('fs').createWriteStream(`./tmp-${fileName}`);
// Listen for the file to be done writing, then resolve
file.on('finish', () => {
fs.rename(`./tmp-${fileName}`, `./${fileName}`, reject);
return resolve(fileName);
})
s3.getObject(params).createReadStream()
.on('error', (error) => { return reject(error); })
.pipe(file);
} else {
reject(err);
}
});
});
};https://stackoverflow.com/questions/42655550
复制相似问题