NodeJS:通过Knox将纯文本上传到s3,我得到statusCode = 505?

时间:2012-04-23 07:08:55

标签: node.js amazon-s3 coffeescript

我有以下代码,其中message是JSON字符串。我试图将此消息上传到s3,并将消息的md5作为目标文件名。我正在获得'505'statusCode。我是NodeJS的新手,不知道我在这里做错了什么?

knoxInitParams =
    'key': awsKey
    'secret': awsPrivateKey
    'bucket': bucket

client = knox.createClient knoxInitParams   

buff = new Buffer message
reqHeader = 
    'Content-Length': buff.length
    'Content-Type': 'text/plain'
    'x-amz-acl': 'private'

req = client.put '/tmp/xxx.txt', reqHeader
req.on 'response', (res) ->
    console.log res.statusCode
    console.log res.headers
    if res.statusCode is 200
        console.log res.url
req.on 'error', (err) ->
    console.error "S3 Error: ", err
req.end buff

编辑: 将目标更改为硬编码,如下面的回复指出导致问题。但是,我现在得到403 :(

4 个答案:

答案 0 :(得分:5)

您的代码看起来很好。

确保您的日期/时间正确无误。 ntpdate -s pool.ntp.org

答案 1 :(得分:5)

快速注意,我也遇到了这个问题,但我的错误是我的文件名中有空格。

var req = client.put('/tmp/x xx.txt', reqHeader);

我包装了文件名,就像这个

var req = client.put(encodeURIComponent('/tmp/x xx.txt'))

答案 2 :(得分:3)

很可能你的错误就在这里:

req = client.put destination.toLowerCase + '.txt', reqHeader

您可能想要调用destination.toLowerCase

req = client.put destination.toLowerCase() + '.txt', reqHeader

另一方面,我认为这完全没必要 - 它已经是小写的了。

另外,您可能希望了解单元测试 - 这是捕获这些错误的好方法!如果我是你,我会添加一个函数,比如getFileName

getFileName = (contents) ->
  crypto.createHash('md5').update(contents).digest('hex') + '.txt'

现在您可以使用nodeunit,mocha,jasmine或任何其他优秀的测试工具轻松测试此功能,并确保它始终返回您所期望的 - 如果没有,请帮助您立即注意到错误的位置。

我也衷心推荐node的调试器,它也可以帮助你捕获这些错误。

答案 3 :(得分:1)

当我使用自己的S3帐户尝试您的确切代码时,它可以正常工作:

$ coffee test
200
{ 'x-amz-id-2': 'f5C32nQHlE0WI8jtNFEZykRFAdrM8ZdBzgeAxc23bnJ2Ti4bYKmcY3pX/KpEzyZg',
  'x-amz-request-id': 'B41AACFF85661C2E',
  date: 'Tue, 01 May 2012 23:15:39 GMT',
  etag: '"44b25eb6d36a88713b7260d8db15b24b"',
  'content-length': '0',
  server: 'AmazonS3' }

检查您的ID /密钥/存储桶以及@skrewler建议的日期/时间。