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)
所以如果进度表明它已经完成,但结束函数从未被调用。什么好主意吗?
查看您的日志消息,它几乎是重试…然后计时结束。这让我觉得它没有通过MD5验证。
如果您查看https://www.npmjs.com/package/s3#clientuploadfileparams,您将看到它在MD5问题上重试。如果您查看日志中报告的总数,您还会看到它达到总数至少3次,这与您在客户端参数中设置的重试计数相匹配。
该节点模块支持记录另一个值uploader.progressMd5Amount,
尝试将其添加到您的记录器。我想知道这些金额是否会有不同的报告。并尝试检查req.file.path
的内容
相关文章:
- 在另一个函数成功结束后调用该函数
- 在动画结束之前调用函数
- settimeout调用的函数未结束
- 函数1结束后,JavaScript调用函数2
- Javascript渲染.如何编写Javascript;t在函数调用结束之前继续执行代码
- 在源节点上调用 stop() 是否会触发已结束的事件
- 在 html5 视频结束时调用 AngularJS 控制器函数
- addclass循环结束时调用函数
- 如何在js中等待http调用结束
- 强制Chrome检查$.Ajax调用结束
- Node.js AWS S3上传从不调用结束函数
- 事件调用结束时/ JavaScript
- 如何在getjson调用结束时显示数组内容
- Jquery 2.1 -等待两个ajax调用结束,然后销毁元素
- JavaScript:在另一个函数调用结束后继续执行函数
- 如何等待一个ajax调用结束进行另一个ajax调用循环
- Angular DTOptionsBuilder ajax调用结束时是否有回调?
- Angularjs/jQuery: ajax调用结束后改变表格的宽度
- Ajax调用在IE和Chrome中有效(仅在Firefox中,当在Ajax调用结束时以调试模式添加断点时)
- 发出一系列(n) AJAX调用结束的信号