2013-01-03 40 views
18

मैं एक आने वाली http प्रतिक्रिया को परिवर्तित करना चाहता हूं जो एक स्ट्रीम है और डेटा को एक चर में संग्रहीत करता है। मुझे नोड धाराओं के बारे में बहुत कुछ नहीं है और मैं इसे ठीक से करने के लिए संघर्ष कर रहा हूं।अनुरोध मॉड्यूल का उपयोग करके मैं एक HTTP प्रतिक्रिया कैसे बफर कर सकता हूं?

var request = require('request'); 

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

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

अद्यतन

यह मेरा पूरा कोड। मेरा लक्ष्य छवि को अनुरोध के साथ प्राप्त करना और इसे mongodb में संग्रहीत करना है। लेकिन छवि हमेशा दूषित है। मैंने सोचा क्योंकि अनुरोध प्रतिक्रिया एक धारा थी, छवि केवल आंशिक रूप से सहेजी गई थी और इसलिए भ्रष्टाचार था।

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. 

    }); 

}) 

अब आप स्पष्ट किया है कि उस अनुरोध बफर प्रतिक्रिया कैसे मैं ठीक से भ्रष्टाचार के बिना छवि को बचा सकता है पर किसी भी विचार है।

उत्तर

33

अनुरोध मॉड्यूल आपके लिए प्रतिक्रिया बफर करता है। कॉलबैक में, body एक स्ट्रिंग (या Buffer) है।

यदि आप कॉलबैक प्रदान नहीं करते हैं तो आपको केवल अनुरोध से स्ट्रीम प्राप्त होती है; request() एक Stream देता है।

See the docs for more detail and examples.


अनुरोध मानता है कि प्रतिक्रिया पाठ है, इसलिए यह एक सिरिंग में प्रतिक्रिया शरीर कन्वर्ट करने के लिए (चाहे MIME प्रकार की) कोशिश करता है। यह बाइनरी डेटा भ्रष्ट करेगा। यदि आप कच्चे बाइट्स प्राप्त करना चाहते हैं, तो 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

कैलिफिकेशन के लिए धन्यवाद। मैंने अपना प्रश्न अपडेट किया है। कृपया देखें कि क्या आप अपना उत्तर विस्तृत कर सकते हैं। – jamjam

+0

अपडेट किया गया। – josh3736

+0

वाह। धन्यवाद, यह काम किया। यह मुझे इतने लंबे समय तक पागल कर रहा है। – jamjam

0

आप पाइप इस ?:

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

की कोशिश की है (हालांकि नहीं काफी परिचित अगर यह इस तरह बाइनरी डेटा के प्रत्यक्ष आवेषण का समर्थन करता है मोंगो पता करने के लिए के साथ, मुझे पता है CouchDB और Riak करते हैं।)

+0

धन्यवाद लेकिन मैं पाइप का उपयोग नहीं करना चाहता। सीधे मोंगोडब में स्ट्रीम करना संभव है लेकिन इसका मतलब यह होगा कि मुझे ग्रिडफ़्स का उपयोग करना होगा जिसे मैं टालना चाहता हूं। – jamjam

+0

यह HTTP बाकी है, लेकिन आप स्थानीय फ़ाइल में भी पाइप कर सकते हैं: 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' 
}; 

सेट एन्कोडिंग शून्य, रिटर्न बफर पर सेट करें।