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)
因此,它的進展表明它已完成,但最終功能永遠不會被調用。有任何想法嗎?
很奇怪。我從使用NPM軟件包[multer](https://github.com/expressjs/multer)切換到使用NPM軟件包[express-fileupload](https://github.com/richardgirges/express-fileupload)和它現在似乎工作。它確實看起來像是由於某種原因失敗了MD5驗證。我很確定'uploader.progressMd5Amount'是'0',但在修復之前沒有再檢查。您的回答非常有幫助,並幫助我找出解決方案,非常感謝。 –