我正在尝试将图像上传到S3但是当我调用s3.putObject(params,callback)时,我的回调永远不会被调用,也不会记录任何错误。
以下是相关代码:
var params = {
Key: key,
Body: imageData,
ContentLength: imageData.byteCount,
ContentType: contentType,
};
this.s3.putObject(params, function(err, data) {
console.log('here');
if (err) {
callback(err);
return;
}
callback(null, key);
});
其中params是{
Key: 'e2f99bf3a321282cc7dfaef69fe8ca62.jpg',
Body: {imageData parsed from request using node-multiparty},
ContentLength: 27802,
ContentType: 'image/jpeg',
}
我已经验证this.s3是有效的,并且this.s3.putObject的typeof按预期运行。
答案 0 :(得分:5)
如果此代码用于lambda函数,则需要在putObject的回调函数中添加context.done(),如下所示:
s3.putObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
context.done();
});
这会强制执行等待回调在退出之前完成。 为此,您还需要从主处理程序中删除任何context.succeed或context.done(如果有的话)。
答案 1 :(得分:1)
我对所有IAM权利都有完全相同的行为,并且在我开始工作之前失去了一点时间。
如果您的lambda函数在VPC中运行,则必须按照this article from AWS blog中的描述为创建端点。
如果您想详细了解它挂起的详细信息,可以使用以下代码。不要给出回调,而是保留对请求的引用并基本观察其事件(请参阅S3.putObject和AWS.Request的文档。)
var obj = s3.putObject(params);
obj.on('validate', (...args)=>{args.unshift('validate'); console.log(...args);})
.on('build', (...args)=>{args.unshift('build'); console.log(...args);})
.on('sign', (...args)=>{args.unshift('sign'); console.log(...args);})
.on('send', (...args)=>{args.unshift('send'); console.log(...args);})
.on('retry', (...args)=>{args.unshift('retry'); console.log(...args);})
.on('extractError', (...args)=>{args.unshift('extractError'); console.log(...args);})
.on('extractData', (...args)=>{args.unshift('extractData'); console.log(...args);})
.on('success', (...args)=>{args.unshift('success'); console.log(...args);})
.on('error', (...args)=>{args.unshift('error'); console.log(...args);})
.on('complete', (...args)=>{args.unshift('complete'); console.log(...args);})
.on('httpHeaders', (...args)=>{args.unshift('httpHeaders'); console.log(...args);})
.on('httpData', (...args)=>{args.unshift('httpData'); console.log(...args);})
.on('httpUploadProgress', (...args)=>{args.unshift('httpUploadProgress'); console.log(...args);})
.on('httpDownloadProgress', (...args)=>{args.unshift('httpDownloadProgress'); console.log(...args);})
.on('httpError', (...args)=>{args.unshift('httpError'); console.log(...args);})
.on('httpDone', (...args)=>{args.unshift('httpDone'); console.log(...args);})
.send();
通过这样做,我得看到底层的HTTP请求正试图到达存储桶的公共URL,除非您有端点,否则这是VPC无法实现的。)。
以下是关于从AWS blog访问VPC的AWS资源的另一篇文章。