2012-04-23 25 views
5

Tôi có đoạn mã sau, trong đó thông điệp là một chuỗi JSON. Tôi đang cố gắng để tải lên này để s3 với md5 của tin nhắn như là tên tập tin đích. Tôi nhận được mã trạng thái '505'. Tôi mới đến NodeJS và không chắc chắn những gì tôi đang làm sai ở đây?NodeJS: Tải văn bản thuần túy lên s3 qua Knox và tôi nhận 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 

Thay đổi đích để mã hóa nó, như trả lời dưới đây đã chỉ ra rằng đã gây ra sự cố. Tuy nhiên, bây giờ tôi nhận được một 403 :(

Trả lời

5

Mã của bạn có vẻ ổn.

Đảm bảo ngày/giờ của bạn chính xác. ntpdate -s pool.ntp.org.

+0

Wow, cảm ơn! Điều đó cố định nó ... Nên có suy nghĩ về điều này: ( – Saad

3

Nhiều khả năng lỗi của bạn là ở đây:

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

Bạn có thể muốn gọi destination.toLowerCase:

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

Mặt khác, tôi nghĩ rằng đó là Nếu bạn là bạn, tôi sẽ là Ould thêm một chức năng, nói getFileName:

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

Bây giờ bạn có thể dễ dàng kiểm tra chức năng này với nodeunit, mocha, hoa nhài hoặc bất kỳ tiện ích thử thách lớn khác, và chắc chắn rằng nó luôn luôn trả những gì bạn mong đợi - và nếu không, hãy giúp bạn nhận thấy ngay lập tức khi có lỗi.

Tôi cũng có thể chân thành khuyên dùng trình gỡ rối của nút, điều này cũng giúp bạn nắm bắt các lỗi này.

+0

Ah này, tôi mới để CoffeeScript và làm cho một sai lầm đó. Tôi đã sửa lỗi đó và bây giờ tôi đang sử dụng hằng số 'tmp/xxx.txt' làm tên tệp. Tuy nhiên, bây giờ tôi nhận được 403 (Cấm). Tôi là 100% rằng chìa khóa + bí mật của tôi là chính xác, không chắc chắn những gì tôi đang làm sai. Cảm ơn lời khuyên, tôi nên def. được kiểm tra đơn vị. – Saad

1

Khi tôi cố gắng mã chính xác của bạn với tài khoản S3 của riêng tôi, nó hoạt động tốt:

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

Kiểm tra ID/khóa/thùng, và ngày của bạn/thời gian như @skrewler gợi ý.

+0

Cảm ơn bạn, tôi đã thử đề nghị ở trên và sửa nó. Tôi muốn Amazon sẽ ra mắt chính thức của họ node.js sdk – Saad

+0

@Saad, nó sẽ là tốt đẹp, mặc dù trong trường hợp này knox đã làm khá tốt! – Ashe

+0

Chắc chắn, tôi nhớ những thông báo lỗi chi tiết hơn Giống như với Amazon PHP SDK, bạn thực sự nhận được thông báo thời gian bù đắp Với Knox, bạn khá nhiều chỉ nhận được statusCode (trừ khi tôi bị mất tích một cái gì đó?) – Saad

5

Ghi chú nhanh, tôi cũng gặp sự cố này, nhưng lỗi của tôi là tôi đã có một khoảng trống trong tên tệp của mình.

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

tôi quấn tên tập tin, như

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

+0

'encodeURIComponent' đã sửa nó cho tôi. – respectTheCode

Các vấn đề liên quan