2012-04-23 2 views
5

次のコードがあります。ここで、messageはJSON Stringです。私は宛先ファイル名としてメッセージのmd5でs3にこれをアップロードしようとしています。私は505ステータスコードを取得しています。私はNodeJSが初めてで、私がここで間違っていることを確かめていませんか?NodeJS:Knox経由でs3にプレーンテキストをアップロードすると、statusCode = 505になりますか?

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 :(

答えて

5

コードは正常です。

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

+0

うわー、ありがとう!それを修正しました...これについて考えていたはずです:( – Saad

3

を取得していますほとんどのバグはここにある:あなたはおそらくdestination.toLowerCase呼び出したい

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

:一方

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

を、私はそれがだと思います

単体テストを調べることができます - この種のバグを捕まえるのに最適な方法です!もし私があなただったら、私はw機能を追加ウルド、getFileNameを言う:

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

今、あなたは簡単にnodeunit、モカ、ジャスミンや他の偉大なテストユーティリティのいずれかでこの機能をテストし、それは常にあなたが期待するものを返すことを確認することができます - とそうでない場合は、エラーが発生した場所にすぐに気付くのを手伝ってください。

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

+0

ああのように、ファイル名を包んだ、私はCoffeeScriptのに新しいですし、そこにミスを犯しました。私はそれを修正し、今では定数 'tmp/xxx.txt'をファイル名として使用しています。しかし、今、私は403(禁止されている)を取得しています。私は自分の鍵+秘密が正しいと思っているが、何が間違っているのか分からないのは100%だ。 ヒントをありがとう、私はdefする必要があります。ユニットテストです。 – Saad

1

私は自分のS3アカウントを持つあなたの正確なコードをしようとすると、それが正常に動作します:@skrewlerが示唆するように

$ 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 /キー/バケットをチェックして、日付/時間。

+0

上記の提案を試してみて、それを修正しました。Amazonが独自の公式ノードnode.jsを立ち上げたければ、 – Saad

+0

@Saad、この場合、knoxはかなりうまくいっています! – Ashe

+0

確かに、私はもっと詳細なエラーメッセージを見逃しています。Amazon PHP SDKのように、実際には時間オフセットメッセージが表示されます。何か?) – Saad

5

私もこの問題に遭遇しましたが、私のエラーは私のファイル名にスペースがあったことです。

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

私はこの

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

+0

からデータイベントを受信することができます。 'encodeURIComponent'は私のためにそれを修正しました。 – respectTheCode

関連する問題