5

メッセージが JSON 文字列である次のコードがあります。メッセージの md5 を宛先ファイル名として、これを s3 にアップロードしようとしています。「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

4 に答える 4

5

簡単に言うと、私もこの問題に遭遇しましたが、ファイル名にスペースが含まれていたというエラーがありました。

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

このようにファイル名をラップしました

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

于 2012-05-11T18:54:57.753 に答える
5

あなたのコードは問題ないようです。

日付/時刻が正しいことを確認してください。 ntpdate -s pool.ntp.org.

于 2012-05-01T22:21:55.290 に答える
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、またはその他の優れたテスト ユーティリティを使用してこの関数を簡単にテストし、常に期待どおりの結果が返されることを確認できます。そうでない場合は、エラーの場所にすぐに気付くことができます。

ノードのデバッガーも心からお勧めします。これは、これらのバグをキャッチするのにも役立ちます。

于 2012-04-23T14:18:48.487 に答える
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' }

@skrewler が提案するように、ID/キー/バケット、および日付/時刻を確認してください。

于 2012-05-01T23:16:20.903 に答える