を使用して、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'だったと確信していますが、修正する前にもう一度チェックしませんでした。あなたの答えは非常に役に立ち、私が解決策を見つけ出すのを助けました。とてもありがとうございました。 –