แปลง
สตรีมการแปลงนั้นสามารถอ่านได้และเขียนได้ดังนั้นจึงเป็นสตรีม 'กลาง' ที่ดีมาก ด้วยเหตุนี้บางครั้งพวกเขาถูกเรียกว่าthrough
สตรีม พวกมันคล้ายกับดูเพล็กซ์สตรีมด้วยวิธีนี้ยกเว้นมีอินเตอร์เฟสที่ดีในการจัดการข้อมูลแทนที่จะส่งผ่านเท่านั้น วัตถุประสงค์ของการแปลงกระแสข้อมูลคือการจัดการข้อมูลตามที่ได้ถูกส่งไปยังกระแสข้อมูล คุณอาจต้องการที่จะทำการโทรแบบ async บางอย่างหรือรับบางฟิลด์ทำการแมปบางอย่าง ฯลฯ
สำหรับวิธีการสร้างการแปลงกระแสดูที่นี่และที่นี่ สิ่งที่คุณต้องทำคือ:
- รวมถึงโมดูลกระแส
- ยกตัวอย่าง (หรือสืบทอดจาก) คลาส Transform
- ใช้วิธีการที่ใช้
_transform
(chunk, encoding, callback)
อันคือข้อมูลของคุณ objectMode = true
ส่วนใหญ่เวลาที่คุณจะไม่ต้องกังวลเกี่ยวกับการเข้ารหัสถ้าคุณกำลังทำงานอยู่ใน โทรกลับถูกเรียกเมื่อคุณเสร็จสิ้นการประมวลผลอัน อันนี้จะถูกผลักไปยังกระแสต่อไป
หากคุณต้องการโมดูลช่วยที่ดีที่จะช่วยให้คุณสามารถทำผ่านกระแสได้อย่างง่ายดายจริงๆผมขอแนะนำให้through2
สำหรับการจัดการข้อผิดพลาดโปรดอ่านต่อไป
ท่อ
ในห่วงโซ่ท่อการจัดการข้อผิดพลาดย่อมไม่ใช่เรื่องเล็กน้อย ตามหัวข้อ.ท่อ () นี้ไม่ได้ถูกสร้างขึ้นเพื่อส่งต่อข้อผิดพลาด ดังนั้นสิ่งที่ชอบ ...
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
เฟรมเวิร์กทำให้ง่ายขึ้นมาก