【问题标题】:Uploading to S3 with Node/Knox : socket hang up使用 Node/Knox 上传到 S3:套接字挂断
【发布时间】:2015-02-08 04:05:15
【问题描述】:

我正在尝试获取()文件并将它们流式传输到我的 s3 存储桶,有人可以告诉我我做错了什么吗?

我的代码:

var client = knox.createClient({
    key: 'AAAAAAAAAAAA',
    secret: 'BBBBBBBBBBBB',
    bucket: 'my-imgs',
});
var elem = list.shift(); // {_id:'filename.jpg', main_img: 'http://example.com/file.jpg'}
  request.get(elem.main_img,function(err,res){
      var headers = {
          'Content-Length': res.headers['content-length'],
          'Content-Type': res.headers['content-type'],
          'x-amz-acl': 'public-read'
      };
      console.log(headers) //outputs are ok, error comes after
      var req = client.putStream(res, elem._id, headers,function(err,s3res){
        if(err) console.log(err);
        console.log(s3res);
      });
  }).on('error', function(err) {
    console.log(err)
  });

标头对象已正确填充,请求没有任何错误,几秒钟后我得到:

{ [Error: socket hang up] code: 'ECONNRESET' }

我是否必须以特定方式配置我的存储桶才能接受转移? 我刚刚通过 AWS 控制台以“美国标准”创建了它,并且只做了一件事,添加了一个我认为允许上传的策略。我感觉可能是这个问题,但我不知道如何解决它,而且我看到的所有教程都非常过时,请给我一个线索!

政策:

{
    "Statement": [
        {
            "Sid": "allow-public-read",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-imgs/*"
        },
        {
            "Sid": "allow-public-put",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-imgs/*"
        }
    ]
}

【问题讨论】:

  • 你找到解决方案了吗?
  • 如果你想使用回调,使用getFile(url, callback)而不是get(url)

标签: node.js amazon-s3 knox-amazon-s3-client


【解决方案1】:

你可以在你的 app.js 中试试这个

var http = require('http');

//increase the max socket limit
http.globalAgent.maxSockets = 1024;

【讨论】:

  • 我遇到了同样的问题,不幸的是,上述操作没有任何影响。
【解决方案2】:

上周我也在为同样的问题苦苦挣扎。很高兴我找到了解决方案:为了让它工作,您需要结束您的 S3 请求:

var req = client.putStream(res, elem._id, headers,function(err,s3res){
    if(err) console.log(err);
    console.log(s3res);
});
req.end();

或者简单地说:

var req = client.putStream(res, elem._id, headers,function(err,s3res){
    if(err) console.log(err);
    console.log(s3res);
}).end();

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 2020-10-30
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2018-02-04
    相关资源
    最近更新 更多