繁体   English   中英

Node.js AWS S3上传永不调用结束功能

[英]Node.js AWS S3 Upload Never Calls End Function

我正在使用此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)

因此进度表明它已完成,但从未调用过end函数。 有任何想法吗?

查看您的日志消息,似乎几乎正在重试...然后超时。 这使我认为它未通过MD5验证。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM