Node.js 303连接到AWS-SDK时的永久重定向

时间:2013-04-20 13:42:50

标签: javascript node.js amazon-web-services amazon-s3 http-status-code-301

下午好,

我试图建立与我的aws产品api的连接,但是我不断收到301永久重定向错误,如下所示:

{ [PermanentRedirect: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.]
  message: 'The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.',
  code: 'PermanentRedirect',
  name: 'PermanentRedirect',
  statusCode: 301,
  retryable: false }

我用来连接API的代码如下:

var aws = require('aws-sdk');

//Setting up the AWS API
aws.config.update({
    accessKeyId: 'KEY',
    secretAccessKey: 'SECRET',
    region: 'eu-west-1'
})

var s3 = new aws.S3();

s3.createBucket({Bucket: 'myBucket'}, function() {
    var params = {Bucket: 'myBucket', Key: 'myKey', Body: 'Hello!'};
    s3.putObject(params, function(err, data) {
        if (err)
            console.log(err)
        else
            console.log("Successfully uploaded data to myBucket/myKey");
    });
});

如果我尝试使用不同的区域,例如us-west-1,我会得到同样的错误。

我做错了什么?

非常感谢您提前!

3 个答案:

答案 0 :(得分:5)

我已经解决了这个问题:

您必须确保已经创建了一个具有相同名称的存储桶;在这种情况下,存储桶的名称将是“myBucket”。

s3.createBucket({Bucket: 'myBucket'}, function() {
var params = {Bucket: 'myBucket', Key: 'myKey', Body: 'Hello!'}; 

创建存储桶后,转到属性并查看其使用的区域 - 将其添加到:

aws.config.update({
    accessKeyId: 'KEY',
    secretAccessKey: 'SECRET',
    region: 'eu-west-1'
})

现在应该可以了!祝福

答案 1 :(得分:2)

我刚刚遇到过这个问题,我认为http://aws.amazon.com/sdkfornodejs/的示例不正确。

演示代码的问题是Bucket名称应为小写 - http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html

如果演示实际上在s3.createBucket中的回调上输出了err参数,那么这将是显而易见的。

在您创建它们的区域中,存储桶名称也必须是唯一的。

s3.createBucket({Bucket: 'mylowercaseuniquelynamedtestbucket'}, function(err) {

    if(err){
        console.info(err);
    }else{
        var params = {Bucket: 'mylowercaseuniquelynamedtestbucket', Key: 'testKey', Body: 'Hello!'};
        s3.putObject(params, function(err, data) {
            if (err)
                console.log(err)
            else
                console.log("Successfully uploaded data to testBucket/testKey");
        });
    }

 })

答案 2 :(得分:2)

被困在这一段时间......

在我的配置文件中设置区域名称或将其留空都没有解决问题。我遇到了关于解决方案的要点,这很简单:

假设:

var AWS = require('aws-sdk');

在实例化S3对象之前,请执行以下操作:

AWS.config.update({"region": "us-west-2"}) //replacing your region there

然后我可以毫无问题地拨打以下电话:

var storage = new AWS.S3();
var params = {
                Bucket: config.aws.s3_bucket,
                Key: name,
                ACL:'authenticated-read',
                Body: data
            }
storage.putObject(params, function(storage_err, data){...})