2012-04-23 16 views
5

Mam następujący kod, gdzie wiadomość jest ciągiem JSON. Próbuję przesłać to do s3 z md5 wiadomości jako docelową nazwą pliku. Otrzymuję kod statusu "505". Jestem nowy w NodeJS i nie jestem pewien, co robię źle tutaj?NodeJS: Przesyłanie czystego tekstu do s3 za pośrednictwem Knox i otrzymuję 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 

Edit: Zmieniono docelowe, aby go zakodować, a poniżej odpowiedź wskazał, że był przyczyną problemu. Jednak teraz jestem coraz 403 :(

Odpowiedz

5

Twój kod wygląda dobrze.

Upewnij się, że data/godzina są prawidłowe. ntpdate -s pool.ntp.org.

+0

Wow, dzięki! To naprawiło ... Powinienem pomyśleć o tym :( – Saad

3

Najprawdopodobniej twój błąd jest tutaj:

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

Prawdopodobnie chcą powołać destination.toLowerCase:

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

Z drugiej strony, myślę, że to zupełnie niepotrzebne - będzie to już małe:

Na marginesie warto przyjrzeć się testom jednostkowym - to świetny sposób na złapanie tego rodzaju błędów! Gdybym był tobą, ould dodać funkcję, powiedzmy getFileName:

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

Teraz można łatwo przetestować tę funkcję z nodeunit, mokka, jaśminu lub którykolwiek z pozostałych wielkich narzędzi testowych i upewnij się, że zawsze zwraca to, czego oczekują - i jeśli nie, pomóż od razu zauważyć, gdzie jest błąd.

Mogę również serdecznie polecić debugger węzła, który również pomaga złapać te błędy.

+0

Ah, jestem nowy na coffeescript i popełnił tam błąd. Naprawiłem to i teraz używam stałego "tmp/xxx.txt" jako nazwy pliku. Jednak teraz dostaję 403 (Zabronione). Jestem w 100%, że mój klucz + sekret jest poprawny, nie jestem pewien, co robię źle. Dzięki za porady, powinienem powiedzieć. być testowaniem jednostkowym. – Saad

1

Kiedy próbuję dokładną kod z własnego konta S3, to działa dobrze:

$ 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' } 

Sprawdź swój identyfikator/klucz/wiadro i datę/godzinę, jak sugeruje @skrewler.

+0

Dzięki, spróbowałem powyższej sugestii i to naprawiłem. Żałuję, że Amazon nie uruchomi własnego oficjalnego pliku node.js sdk – Saad

+0

@Saad, byłoby miło, chociaż w to skrzynka ma się całkiem nieźle! – Ashe

+0

Zdecydowanie .. Tęsknię za bardziej szczegółowymi komunikatami o błędach.Podobnie jak z SDK Amazon PHP, otrzymujesz komunikat przesunięcia czasu.Z Knox, po prostu dostaniesz statusCode (chyba że mi brakuje coś?) – Saad

5

Szybka uwaga, wpadłem również na ten problem, ale mój błąd polegał na tym, że miałem spację w nazwie pliku.

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

ja owinięty nazwę pliku, jak to

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

+0

'encodeURIComponent' naprawił to za mnie. – respectTheCode

Powiązane problemy