2012-04-23 83 views
5

我有以下代碼,其中消息是JSON字符串。我試圖上傳到s3與消息的md5作爲目標文件名。我得到'505'statusCode。我是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 2012-05-02 02:16:48

3

最有可能你的錯誤是在這裏:

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

你可能想調用destination.toLowerCase

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%認爲我的鑰匙+祕密是正確的,不知道我做錯了什麼。 感謝提示,我應該確定。做單元測試。 – Saad 2012-04-24 01:13:38

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建議。

+0

謝謝你,我試過了上面的建議並修復了它。我希望亞馬遜會推出自己的官方node.js sdk – Saad 2012-05-02 02:18:05

+0

@Saad,它會很好,雖然在這個案例Knox做得相當好! – Ashe 2012-05-02 02:31:39

+0

當然,我錯過了更詳細的錯誤信息,就像亞馬遜PHP SDK一樣,你實際上得到了時間偏移消息,用Knox,你幾乎可以得到statusCode(除非我失蹤什麼?) – Saad 2012-05-02 06:16:48

5

快速提示,我也遇到了這個問題,但我的錯誤是我的文件名中有一個空格。

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

我包的文件名,這樣

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

+0

'encodeURIComponent'爲我解決了它。 – respectTheCode 2012-11-18 10:30:19

相關問題