2013-01-03 35 views
18

Tôi sẽ chuyển đổi phản hồi http đến là luồng và lưu trữ dữ liệu trong một biến. Tôi không có nhiều về các luồng nút và tôi đang cố gắng để làm điều này đúng cách.Làm cách nào để tôi có thể đệm phản hồi http bằng mô-đun yêu cầu?

var request = require('request'); 

request('http://google.com/doodle.png', function (error, response, body) { 

    // buffer the stream response to and a string variable. 
}) 

CẬP NHẬT

này mã đầy đủ của tôi. Mục tiêu của tôi là để có được hình ảnh với yêu cầu và lưu trữ nó trong mongodb. Nhưng hình ảnh luôn bị hỏng. Tôi nghĩ vì phản hồi yêu cầu là một luồng, hình ảnh chỉ được lưu một phần và do đó tham nhũng.

request('http://google.com/doodle.png', function (error, response, body) { 

    image = new Buffer(body, 'binary'); 

    db.images.insert({ filename: 'google.png', imgData: image}, function (err) { 

     // handle errors etc. 

    }); 

}) 

Bây giờ bạn đã làm rõ yêu cầu của bộ đệm phản hồi bất kỳ ý tưởng nào về cách tôi có thể lưu hình ảnh một cách đúng cách mà không bị hỏng.

Trả lời

33

Mô-đun yêu cầu sẽ gửi phản hồi cho bạn. Trong gọi lại, body một chuỗi (hoặc Buffer).

Bạn chỉ nhận lại luồng từ yêu cầu nếu bạn không cung cấp gọi lại; request()trả lại a Stream.

See the docs for more detail and examples.


yêu cầu giả định rằng các phản ứng là văn bản, vì vậy nó sẽ cố gắng để chuyển đổi cơ thể phản ứng thành một sring (không phụ thuộc vào loại MIME). Điều này sẽ làm hỏng dữ liệu nhị phân. Nếu bạn muốn nhận các byte thô, hãy chỉ định nullencoding.

request({url:'http://google.com/doodle.png', encoding:null}, function (error, response, body) { 
    db.images.insert({ filename: 'google.png', imgData: body}, function (err) { 

     // handle errors etc. 

    }); 
}); 
+1

Cảm ơn bạn đã bình thường hóa. Tôi đã cập nhật câu hỏi của mình. Vui lòng xem liệu bạn có thể mở rộng câu trả lời của mình không. – jamjam

+0

Đã cập nhật. – josh3736

+0

Wow. Cảm ơn bạn, nó đã hoạt động. Đó là lái xe cho tôi hạt quá lâu. – jamjam

0

Các bạn đã thử đường ống này ?:

request.get('http://google.com/doodle.png').pipe(request.put('{your mongo path}')) 

(Mặc dù không đủ quen thuộc với Mongo biết nếu nó hỗ trợ chèn trực tiếp dữ liệu nhị phân như thế này, tôi biết CouchDB và Riak làm.)

+0

Cảm ơn nhưng tôi không muốn sử dụng đường ống. Có thể truyền trực tiếp vào mongodb nhưng điều đó có nghĩa là tôi sẽ phải sử dụng Gridfs mà tôi muốn tránh. – jamjam

+0

Đây là phần còn lại HTTP, nhưng bạn cũng có thể gửi đến một tệp cục bộ: https://github.com/mikeal/request#streaming – 7zark7

2
var options = { 
    headers: { 
     'Content-Length': contentLength, 
     'Content-Type': 'application/octet-stream' 
    }, 
    url: 'http://localhost:3000/lottery/lt', 
    body: formData, 
    encoding: null, // make response body to Buffer. 
    method: 'POST' 
}; 

đặt mã hóa thành không, trả về Bộ đệm.

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