两分钟后将大文件上传到Amazon S3将创建两个副本

时间:2018-07-30 09:14:04

标签: node.js express amazon-s3 busboy

我正在尝试从用NodeJS编写的服务器上将大文件(50至60 MB)上传到Amazon S3存储桶。服务器从ReactJS前端接收文件。我遇到了一个问题,即有两个相同文件的副本上载到S3存储桶(尽管时间戳相差两分钟)。 从我的存储桶中查看屏幕截图

这是我用expressJS / NodeJS编写的api:

app.post('/myAPI', (req, res) => {
  
  console.log("------------------------------- In builds API - post request -------------------------------");
  
    console.log(req.method);
    console.log("This device is Android");
    let File = req.files.file;

    //appending the date object to the file name
    let date = JSON.stringify(new Date()).replace(/\"/g, "").replace(/:/g, "-");
    let index = File.name.lastIndexOf(".");
    let newname = [File.name.slice(0, index), date, File.name.slice(index)].join('');
    newname = req.body.project + "/" + newname;
    
    let busboy = new Busboy({ headers: req.headers });
    
    //this event is fired when the data is successfully uploaded
    eventEmitter.on('data_uploaded', function() {
      res.end(`done !!!!!!!!!!!!!!!!!!`);
    });

    busboy.on('finish', function( ) {
      
      let s3bucket = new AWS.S3({
        accessKeyId: IAM_USER_KEY,
        secretAccessKey: IAM_USER_SECRET,
        Bucket: BUCKET_NAME
      });

      s3bucket.createBucket(function () {
        console.log("In create bucket method");
        var params = {
          Bucket: BUCKET_NAME,
          Key: newname,
          Body: File.data
        };
        s3bucket.upload(params, function (err, data) {
          if (err) {
            console.log('error in callback');
            console.log(err);
          }
          
          console.log(data);
          
          eventEmitter.emit('data_uploaded'); 
        });
      });

    });
    
    //piping the request to writable stream busboy
    req.pipe(busboy);
  }

});

这是我的控制台的样子

.. 两次都

我正在检查浏览器的“网络”标签,并且发送的请求只有一个

,尽管这样仅收到一次响应:

我在做什么错..请在这里帮助我! 预先感谢一百万。

(我使用this tutorial by Keith Weaver编写了此API)。

1 个答案:

答案 0 :(得分:0)

req 对象在默认超时2分钟后过期,这是创建新的 req 对象和新API的原因。

在服务器实例上覆盖超时键解决了我的问题:

让服务器= app.listen(端口,()=> {      console.log(Started up at port ${port});    });

server.timeout = 600000; // 6 lac毫秒= 10分钟,默认值为2分钟

module.exports = {app};

感谢this answerSomeKittens