2016-11-13 101 views
0

我使用this AWS S3 NPM Package來處理來自我的Express服務器的S3上傳。我遇到了上傳器從不調用最終功能的問題。Node.js AWS S3上傳從不呼叫結束功能

var key = utils.createID(Date.now()); 
var s3 = require('s3'); 
var client = s3.createClient({ 
    maxAsyncS3: 20,  // this is the default 
    s3RetryCount: 3, // this is the default 
    s3RetryDelay: 1000, // this is the default 
    multipartUploadThreshold: 20971520, // this is the default (20 MB) 
    multipartUploadSize: 15728640, // this is the default (15 MB) 
    s3Options: { 
    accessKeyId: "ACTUALKEYHERE", 
    secretAccessKey: "ACTUALSECRETHERE", 
    // any other options are passed to new AWS.S3() 
    // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#constructor-property 
    }, 
}); 
var params = { 
    localFile: req.file.path, 

    s3Params: { 
    Bucket: "ACTUALBUCKETHERE", 
    Key: key, 
    // other options supported by putObject, except Body and ContentLength. 
    // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property 
    }, 
}; 
var uploader = client.uploadFile(params); 
console.log(key); 

uploader.on('error', function(err) { 
    console.error("unable to sync:", err.stack); 
}); 
uploader.on('progress', function() { 
    console.log("progress", uploader.progressAmount, uploader.progressTotal); 
}); 
uploader.on('end', function() { 
    // **NEVER GETS CALLED** 
    console.log("done uploading"); 
}); 

我已經用其他字符串替換了存儲桶名稱和AWS密鑰,但其他都一樣。控制檯打印下面的代碼。

205d3e63ed92f6edbae59465b4769e5feb2560a7 
progress 16384 93619 
progress 32768 93619 
progress 49152 93619 
progress 65536 93619 
progress 81920 93619 
progress 93619 93619 
progress 93619 93619 
progress 16384 93619 
progress 32768 93619 
progress 49152 93619 
progress 65536 93619 
progress 81920 93619 
progress 93619 93619 
progress 93619 93619 
progress 16384 93619 
progress 32768 93619 
progress 49152 93619 
progress 65536 93619 
progress 81920 93619 
progress 93619 93619 
progress 93619 93619 
unable to sync: RequestTimeout: Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed. 
    at Request.extractError (/Code/node_modules/s3/node_modules/aws-sdk/lib/services/s3.js:343:35) 
    at Request.callListeners (/Code/node_modules/s3/node_modules/aws-sdk/lib/sequential_executor.js:100:18) 
    at Request.emit (/Code/node_modules/s3/node_modules/aws-sdk/lib/sequential_executor.js:77:10) 
    at Request.emit (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:604:14) 
    at Request.transition (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:21:12) 
    at AcceptorStateMachine.runTo (/Code/node_modules/s3/node_modules/aws-sdk/lib/state_machine.js:14:12) 
    at /Code/node_modules/s3/node_modules/aws-sdk/lib/state_machine.js:26:10 
    at Request.<anonymous> (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:22:9) 
    at Request.<anonymous> (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:606:12) 
    at Request.callListeners (/Code/node_modules/s3/node_modules/aws-sdk/lib/sequential_executor.js:104:18) 
    at Request.emit (/Code/node_modules/s3/node_modules/aws-sdk/lib/sequential_executor.js:77:10) 
    at Request.emit (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:604:14) 
    at Request.transition (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:21:12) 
    at AcceptorStateMachine.runTo (/Code/node_modules/s3/node_modules/aws-sdk/lib/state_machine.js:14:12) 
    at /Code/node_modules/s3/node_modules/aws-sdk/lib/state_machine.js:26:10 
    at Request.<anonymous> (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:22:9) 
    at Request.<anonymous> (/Code/node_modules/s3/node_modules/aws-sdk/lib/request.js:606:12) 
    at Request.callListeners (/Code/node_modules/s3/node_modules/aws-sdk/lib/sequential_executor.js:104:18) 
    at callNextListener (/Code/node_modules/s3/node_modules/aws-sdk/lib/sequential_executor.js:90:14) 
    at IncomingMessage.onEnd (/Code/node_modules/s3/node_modules/aws-sdk/lib/event_listeners.js:183:11) 
    at emitNone (events.js:91:20) 
    at IncomingMessage.emit (events.js:185:7) 

因此,它的進展表明它已完成,但最終功能永遠不會被調用。有任何想法嗎?

回答

1

看着你的日誌消息,它幾乎看起來是重試...然後超時。這使我認爲它沒有通過MD5驗證。

如果你看https://www.npmjs.com/package/s3#clientuploadfileparams你會看到它在MD5問題上重試。如果您查看日誌中報告的總數,您還會看到它至少達到了3次,這與您在客戶端params中設置的重試次數相符。

該節點模塊支持記錄另一個值uploader.progressMd5Amount,嘗試將其添加到您的記錄器。我想知道這些數額是否會有不同的報告。並嘗試檢查req.file.path的內容。

+0

很奇怪。我從使用NPM軟件包[multer](https://github.com/expressjs/multer)切換到使用NPM軟件包[express-fileupload](https://github.com/richardgirges/express-fileupload)和它現在似乎工作。它確實看起來像是由於某種原因失敗了MD5驗證。我很確定'uploader.progressMd5Amount'是'0',但在修復之前沒有再檢查。您的回答非常有幫助,並幫助我找出解決方案,非常感謝。 –