2015-06-17 19 views
7

Làm cách nào để bạn sử dụng request để tải xuống nội dung của tệp và trực tiếp phát trực tiếp lên s3 bằng cách sử dụng aws-sdk cho nút?phản hồi luồng từ yêu cầu nodejs đến s3

Đoạn code dưới đây mang lại cho tôi Object #<Request> has no method 'read' mà làm cho nó có vẻ như yêu cầu không trả lại một dòng có thể đọc được ...

var req = require('request'); 
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}}); 
var imageStream = req.get(url) 
    .on('response', function (response) { 
     if (200 == response.statusCode) { 
     //imageStream should be read()able by now right? 
     s3.upload({Body: imageStream, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months 
      console.log(err,data); 
     }); 
     } 
    }); 
}); 

mỗi sự aws-sdk docsBody nhu cầu trở thành một đối tượng ReadableStream.

Tôi đang làm gì sai ở đây?

Điều này có thể được rút ra bằng cách sử dụng mô-đun s3-upload-stream, tuy nhiên tôi muốn giới hạn phụ thuộc của tôi.

+0

đâu/thế nào là 'req' được xác định? – mscdex

+0

@mscdex câu hỏi được cập nhật để phản ánh req – rynop

Trả lời

6

Bạn muốn sử dụng các đối tượng response nếu bạn đang tự nghe cho dòng phản ứng:

var req = require('request'); 
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}}); 
var imageStream = req.get(url) 
    .on('response', function (response) { 
     if (200 == response.statusCode) { 
     s3.upload({Body: response, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months 
      console.log(err,data); 
     }); 
     } 
    }); 
}); 
+0

cảm ơn! Đối với những người khác, cách thức nhận dữ liệu của yêu cầu là một chút gây hiểu lầm https://github.com/request/request/issues/931 – rynop

+7

Tôi gặp vấn đề tương tự - câu trả lời này hữu ích nhưng tệp trên s3 kết thúc không phải là byte. Đường ống cùng một yêu cầu cho kết quả đĩa trong một tập tin hợp lệ. –

+1

@JoshSantangelo nếu bạn vẫn gặp sự cố đó, có thể xem giải pháp thay thế của tôi. – d0gb3r7

10

Kể từ khi tôi đã có cùng một vấn đề như @JoshSantangelo (zero byte tập tin trên S3) với [email protected] 0 và [email protected], hãy để tôi thêm một giải pháp thay thế sử dụng http mô-đun riêng Node của (caveat: đơn giản hóa mã từ một dự án thực tế đời sống và không được kiểm tra riêng):

var http = require('http'); 

function copyToS3(url, key, callback) { 
    http.get(url, function onResponse(res) { 
     if (res.statusCode >= 300) { 
      return callback(new Error('error ' + res.statusCode + ' retrieving ' + url)); 
     } 
     s3.upload({Key: key, Body: res}, callback); 
    }) 
    .on('error', function onError(err) { 
     return callback(err); 
    }); 
} 

theo như tôi có thể nói , vấn đề là request không hỗ trợ đầy đủ API luồng Node hiện tại, trong khi aws-sdk phụ thuộc vào nó.

Tài liệu tham khảo:

+3

Đây là giải pháp duy nhất có hiệu quả đối với tôi. Cảm ơn. – Baldur

+0

Điều này đã hiệu quả - nhưng tôi phải sử dụng https thay vì http – Chet

+0

Công tắc đơn giản cho https: var http = require ('http'); var https = require ('https'); nếu (url.toString(). IndexOf ("https") === 0) { http = https; } – Andrew

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