S3.putObject – callback永远不会被调用

我试图上传一个图像到S3,但是当我打电话给s3.putObject(params,callback),我的callback永远不会被调用,并没有错误logging。

以下是相关的代码:

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', }

我已经validation了这个.s3是有效的,type.sofput.sys是按照预期的函数。

       

网上收集的解决方案 "S3.putObject – callback永远不会被调用"

如果这个代码被用于lambda函数,你需要在putObject的callback函数中添加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(); }); 

这迫使执行等待,直到callback被填充之前退出。 为了这个工作,你还需要从主处理程序中删除任何context.succeed或context.done,如果你有一个。

我拥有与IAM权利完全相同的行为,并在开始工作之前浪费了一些时间。

如果您的lambda函数在VPC内部运行,则必须按照 本文中从AWS博客中的描述为S3创build一个端点

如果您想详细了解它挂起的位置,可以使用下面的代码。 而不是给callback一个请求保持引用,并基本上观察它的事件(请参阅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博客访问VPC的AWS资源的post。