परिवर्तन
रूपांतरण धाराएँ पठनीय और लिखने योग्य दोनों हैं, और इस प्रकार वास्तव में अच्छी 'मध्य' धाराएँ हैं। इस कारण से, उन्हें कभी-कभी through
धाराओं के रूप में संदर्भित किया जाता है। वे इस तरह से एक डुप्लेक्स स्ट्रीम के समान हैं, सिवाय इसके कि वे डेटा को हेरफेर करने के लिए केवल भेजने के बजाय एक अच्छा इंटरफ़ेस प्रदान करते हैं। एक ट्रांसफ़ॉर्म स्ट्रीम का उद्देश्य डेटा में हेरफेर करना है क्योंकि यह स्ट्रीम के माध्यम से पाइप किया जाता है। आप कुछ async कॉल करना चाहते हैं, उदाहरण के लिए, या कुछ क्षेत्रों को प्राप्त कर सकते हैं, कुछ चीजों को फिर से बना सकते हैं, आदि।
ट्रांसफ़ॉर्म स्ट्रीम बनाने के लिए यहाँ और यहाँ देखें । तुमको बस यह करना है :
- स्ट्रीम मॉड्यूल शामिल करें
- ट्रांसफ़ॉर्म क्लास को तत्काल (या विरासत से)
- एक
_transform
विधि लागू करें जो एक लेता है (chunk, encoding, callback)
।
चंक आपका डेटा है। यदि आप काम कर रहे हैं तो ज्यादातर समय आपको एन्कोडिंग के बारे में चिंता करने की आवश्यकता नहीं होगी objectMode = true
। कॉलबैक तब कहा जाता है जब आपको चंक को संसाधित किया जाता है। यह हिस्सा फिर अगली धारा में धकेल दिया जाता है।
यदि आप एक अच्छा सहायक मॉड्यूल चाहते हैं जो आपको स्ट्रीम के माध्यम से वास्तव में आसानी से करने में सक्षम होगा, तो मैं सुझाव देता हूं कि 2 ।
त्रुटि से निपटने के लिए, पढ़ते रहें।
पाइप
एक पाइप श्रृंखला में, त्रुटियों को संभालना वास्तव में गैर-तुच्छ है। इस थ्रेड के अनुसार .pipe () आगे की त्रुटियों के लिए नहीं बनाया गया है। तो कुछ इस तरह ...
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
... धारा पर त्रुटियों के लिए केवल सुनना होगा c
। यदि एक त्रुटि घटना पर उत्सर्जित किया गया था a
, जो नीचे पारित नहीं किया जाएगा और वास्तव में, फेंक देगा। इसे सही ढंग से करने के लिए:
var a = createStream();
a.on('error', function(e){handleError(e)})
.pipe(b)
.on('error', function(e){handleError(e)})
.pipe(c)
.on('error', function(e){handleError(e)});
अब, हालांकि दूसरा तरीका अधिक क्रियात्मक है, आप कम से कम इस संदर्भ को रख सकते हैं कि आपकी त्रुटियां कहां हैं। यह आमतौर पर एक अच्छी बात है।
एक पुस्तकालय मुझे मददगार लगता है, हालांकि अगर आपके पास एक ऐसा मामला है जहां आप केवल गंतव्य पर त्रुटियों को पकड़ना चाहते हैं और आप इस बात की परवाह नहीं करते हैं कि यह कहां हुआ है तो यह घटना-धारा है ।
समाप्त
जब कोई त्रुटि ईवेंट को निकाल दिया जाता है, तो अंतिम ईवेंट को निकाल नहीं दिया जाएगा (स्पष्ट रूप से)। किसी त्रुटि ईवेंट को छोड़ने से स्ट्रीम समाप्त हो जाएगी।
डोमेन
मेरे अनुभव में, अधिकांश समय डोमेन वास्तव में अच्छी तरह से काम करते हैं। यदि आपके पास एक अनहेल्ड एरर इवेंट है (यानी किसी श्रोता के बिना स्ट्रीम पर कोई एरर छोड़ना), तो सर्वर क्रैश हो सकता है। अब, जैसा कि उपरोक्त लेख बताता है, आप एक डोमेन में स्ट्रीम लपेट सकते हैं जिसे सभी त्रुटियों को ठीक से पकड़ना चाहिए।
var d = domain.create();
d.on('error', handleAllErrors);
d.run(function() {
fs.createReadStream(tarball)
.pipe(gzip.Gunzip())
.pipe(tar.Extract({ path: targetPath }))
.on('close', cb);
});
डोमेन की सुंदरता यह है कि वे स्टैक के निशान को संरक्षित करेंगे। हालांकि घटना-धारा इसका अच्छा काम करती है।
आगे पढ़ने के लिए, स्ट्रीम-हैंडबुक देखें । बहुत गहराई में, लेकिन सुपर उपयोगी और सहायक मॉड्यूल के बहुत से कुछ महान लिंक देता है।
Promise
चौखटे इसे बहुत सरल बनाते हैं