Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Can';t使用nodeJS从S3下载文件:很少有文件不';完不成_Node.js_Amazon S3 - Fatal编程技术网

Node.js Can';t使用nodeJS从S3下载文件:很少有文件不';完不成

Node.js Can';t使用nodeJS从S3下载文件:很少有文件不';完不成,node.js,amazon-s3,Node.js,Amazon S3,这让我快发疯了 我需要我的服务器从S3下载100个相对较小的文件(最大2MB) 它始终适用于约95%的文件,但会阻止最后6-8个文件。resolve或reject回调从未被调用 我试图并行下载文件 有人经历过这个吗 可能是一个数据包丢失而流没有关闭吗 是否有最大并发下载次数 以下是代码,在95%的情况下技术上有效: let singleGetFromS3 = (bucket, fileName) => { return new Promise((resolve, rejec

这让我快发疯了

我需要我的服务器从S3下载100个相对较小的文件(最大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

看起来您正在侦听错误的事件以确定何时解决。您不希望在从S3的
可读
读取所有字节时解析,而是希望在
文件
完成写入时解析

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);
        }
      });
    });
  };

谢谢我考虑过这一点,但没有想到
writeStream
关闭自身的原因。但很明显,它是有效的,尽管我还有5~6个文件没有完成( :(顺便说一句,我很惊讶地发现S3中如此琐碎的操作对nodeJS来说是如此痛苦…@AugustinRiedinger如果你想简化这一点,我首先不在同一个函数中使用回调、事件/流和承诺。你应该使用bluebird.js来提示你的
fs
,这样你就不需要
fs.st了at()
回调。另外,我编辑了答案,不要使用我最初放置的
'close'
事件,而是使用
'finish'
。@AugustinRiedinger让我用gist@AugustinRiedinger