2016-11-13 3 views
0

Я использую this AWS S3 NPM Package для обработки загрузок S3 с моего экспресс-сервера. У меня проблема, когда загрузчик никогда не вызывает функцию конца.Node.js AWS S3 Upload Never Calls End Function

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', но не проверял еще раз, прежде чем исправлять его. Ваш ответ был очень полезен и помог мне разобраться с решением, поэтому большое вам спасибо. –