2016-11-13 16 views
0

を使用して、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回以上合っていることがわかります。

ノードモジュールが別の値のロギングをサポートしています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'だったと確信していますが、修正する前にもう一度チェックしませんでした。あなたの答えは非常に役に立ち、私が解決策を見つけ出すのを助けました。とてもありがとうございました。 –

関連する問題