Node.js AWS S3上传从不调用结束函数

Node.js AWS S3 Upload Never Calls End Function

本文关键字:调用 结束 函数 js AWS S3 Node      更新时间:2023-09-26

我使用这个AWS S3 NPM包来处理我的Express服务器上的S3上传。我有一个问题,上传程序从不调用end函数。

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)

所以如果进度表明它已经完成,但结束函数从未被调用。什么好主意吗?

查看您的日志消息,它几乎是重试…然后计时结束。这让我觉得它没有通过MD5验证。

如果您查看https://www.npmjs.com/package/s3#clientuploadfileparams,您将看到它在MD5问题上重试。如果您查看日志中报告的总数,您还会看到它达到总数至少3次,这与您在客户端参数中设置的重试计数相匹配。

该节点模块支持记录另一个值uploader.progressMd5Amount,尝试将其添加到您的记录器。我想知道这些金额是否会有不同的报告。并尝试检查req.file.path的内容