代码之家  ›  专栏  ›  技术社区  ›  Robert

大于1MB的文件putObject()超时

  •  4
  • Robert  · 技术社区  · 8 年前

    当尝试使用 putObject() 函数,如果文件大于1 MB,则会超时。我能成功上传的最大CSV文件是1048 KB(25500行),在我尝试上传的6次中,只有4次成功。任何小于1 MB的文件都可以快速上传,不会出现任何故障。什么会导致函数在达到~ 1 MB阈值时挂起并超时?

    相关代码如下:

    function writeToS3(){
        var params = {
            Bucket: bucketName,
            Key: fileName,
            Body: fs.createReadStream(fileName)
        }
    	    	
        s3.putObject(params, function(err, data){
            if(err){
                console.log('Error uploading data to S3 bucket: ' + err);
                throw err;
            } else{
                console.log("Data uploaded to S3 bucket: ", util.inspect(data));
            }
        });
    }

    以下是错误消息:

     Error uploading data to S3 bucket: TimeoutError: Connection timed out after 120000ms
        C:\Users\426782\documents\workspace-sts\lf-rti-file-copier-sql\node_modules\aws-sdk-proxy\node_modules\aws-sdk\lib\request.js:31
                    throw err;
                    ^
    
        TimeoutError: Connection timed out after 120000ms
            at ClientRequest.<anonymous> (C:\Users\426782\documents\workspace-sts\lf-rti-file-copier-sql\node_modules\aws-sdk-proxy\node_modules\aws-sdk\lib\http\node.js:83:34)
            at ClientRequest.g (events.js:292:16)
            at emitNone (events.js:86:13)
            at ClientRequest.emit (events.js:185:7)
            at Socket.emitTimeout (_http_client.js:630:10)
            at Socket.g (events.js:292:16)
            at emitNone (events.js:86:13)
            at Socket.emit (events.js:185:7)
            at Socket._onTimeout (net.js:338:8)
            at ontimeout (timers.js:386:11)
            at tryOnTimeout (timers.js:250:5)
            at Timer.listOnTimeout (timers.js:214:5)
    
        npm ERR! Windows_NT 10.0.14393
        npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "test" "65056"
        npm ERR! node v6.11.4
        npm ERR! npm  v3.10.10
        npm ERR! code ELIFECYCLE
        npm ERR! lf-rti-file-copier@1.0.0 test: `serverless invoke local -f dataRefresh -s dev -d  "65056"`
        npm ERR! Exit status 1
        npm ERR!
        npm ERR! Failed at the lf-rti-file-copier@1.0.0 test script 'serverless invoke local -f dataRefresh -s dev -d  "65056"'.
        npm ERR! Make sure you have the latest version of node.js and npm installed.
        npm ERR! If you do, this is most likely a problem with the lf-rti-file-copier package,
        npm ERR! not with npm itself.
        npm ERR! Tell the author that this fails on your system:
        npm ERR!     serverless invoke local -f dataRefresh -s dev -d  "65056"
        npm ERR! You can get information on how to open an issue for this project with:
        npm ERR!     npm bugs lf-rti-file-copier
        npm ERR! Or if that isn't available, you can get their info via:
        npm ERR!     npm owner ls lf-rti-file-copier
        npm ERR! There is likely additional logging output above.
    
    1 回复  |  直到 8 年前
        1
  •  5
  •   Yevhenii Herasymchuk    8 年前

    我有一个类似的问题,我建议你试试这个方法 upload. https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property

    上载任意大小的缓冲区、blob或流,使用 如果有效负载较大,则智能并发处理部件 足够地

    下面是一个如何转换代码的示例:

    function writeToS3() {
      fs.readFile(fileName, 'utf8', function (err, contents) {
        if (err) {
          console.log('Error during reading file: ' + err);
          throw err;
        } else {
          // Create a binary data from stream
          var base64data = Buffer.from(contents, 'binary')
    
          var params = {
            Bucket: bucketName,
            Key: fileName,
            Body: base64data
          }
    
          s3.upload(params, function (err, data) {
            if (err) {
              console.log('Error uploading data to S3 bucket: ' + err);
              throw err;
            } else {
              console.log("Data uploaded to S3 bucket: ", util.inspect(data));
            }
          });
        }
      });
    }
    

    更新:

    还有,请看一下 Bluebird 图书馆 method ,这将帮助您将所有方法转换为承诺,以便更具可读性。

    更改超时

    Lambda dashboard中有一个可以更改的位置 Timeout 这是它的截图。请改为5分钟。 Basic settings