S3.putObject - 永远不会调用回调

时间:2015-05-16 19:48:57

标签: node.js amazon-s3 aws-sdk

我正在尝试将图像上传到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按预期运行。

2 个答案:

答案 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.putObjectAWS.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资源的另一篇文章。