Node.js рдбрдореА рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рдПрдБ рдпрд╛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ Node js рд╕реНрдЯреНрд░реАрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╕реБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдзрд╛рд░рд╛ рдФрд░ рдорд╛рдирджрдВрдбред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдзрд╛рд░рд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВ, рдкрд╛рдЗрдк (рдкрд╛рдЗрдк), рдЪрдВрдХреНрд╕ (рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛) рдФрд░ рд╡рд╣ рд╕рдм))



рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдиреЛрдбреНрд╕ рдореЗрдВ рдзрд╛рд░рд╛рдПрдБ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ: рдиреЛрдб рдЬреЗрдПрд╕ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХрдИ рдореЙрдбреНрдпреВрд▓ рдзрд╛рд░рд╛рдПрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ HTTP рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ, рдПрдлрдПрд╕ рдкрдврд╝рдирд╛ / рд▓рд┐рдЦрдирд╛, рдЬрд╝реНрд▓рд┐рдм, рдХреНрд░рд┐рдкреНрдЯреЛ, рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдФрд░ рдЕрдиреНрдпред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдзрд╛рд░рд╛рдУрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реНрдЯреНрд░реАрдо рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╕рдХреНрд╖рдо рдбреЗрд╡рд▓рдкрд░ рдмрдирд╛ рджреЗрдЧрд╛ред

рддреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреНрдпрд╛ рд╣реИ (рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рд╕реНрдЯреНрд░реАрдо (рд╕реНрдЯреНрд░реАрдо) рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛)ред рд╕реНрдЯреНрд░реАрдо рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЫреЛрдЯреЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдереЛрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд░реИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ (рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдХрдХреНрд╖рд╛рдУрдВ) рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рддреБрд░рдВрдд рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рднрд╛рдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИред

рдиреЛрдб js рдореЗрдВ 4 рдкреНрд░рдХрд╛рд░ рдХреА рдзрд╛рд░рд╛рдПрдБ рд╣реИрдВ:

  • рдкрдардиреАрдп - рдкрдврд╝рдиреЗ
  • рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп - рд▓реЗрдЦрди
  • рдбреБрдкреНрд▓реЗрдХреНрд╕ - рдкрдврд╝реЗрдВ рдФрд░ рд▓рд┐рдЦреЗрдВ
  • рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо - рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреБрдкреНрд▓реЗрдХреНрд╕ рд╕реНрдЯреНрд░реАрдо рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдмрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдлрд╛рдЗрд▓ рднреЗрдЬрддреЗ рд╣реИрдВред

// 1 - ( )      ,         const getFile = async (req, res, next) => { const fileStream = fs.createReadStream('path to file'); res.contentType('application/pdf'); fileStream.pipe(res); }; // 2 - (  )         const getFile = async (req, res, next) => { const file = fs.readFileSync('path to file'); res.contentType('application/pdf'); res.send(file); }; 

рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд░реНрд╡рд░ рдХреА рд░реИрдо рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рддреБрд░рдВрдд рдкреВрд░реА рдлрд╛рдЗрд▓ рдХреЛ рд░реИрдо рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рднреЗрдЬрддреЗ рд╣реИрдВред

рд▓реЗрдЦ рдореЗрдВ рдЖрдЧреЗ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдЖрдк рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 const { Readable } = require('stream'); // 1 -   const myReadable = new Readable(opt); // 2 -   class myReadable extends Readable { constructor(opt) { super(opt); } } 

рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдореИрдВ 2 рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдкрдардиреАрдп рдзрд╛рд░рд╛


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо NodeJS рдореЗрдВ рдПрдХ рдкрдардиреАрдп рд╕реНрдЯреНрд░реАрдо рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 const { Readable } = require('stream'); class myReadable extends Readable { constructor(opt) { super(opt); } _read(size) {} } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд░реНрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдкрдардиреАрдп рдзрд╛рд░рд╛ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдмрд╛рдХреА рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо HighWaterMark рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ _read рд╡рд┐рдзрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

highWaterMark рдЖрдВрддрд░рд┐рдХ рд╕реНрдЯреНрд░реАрдо рдмрдлрд░ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 16kb) рдЬрд┐рд╕ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд░реАрдбрд┐рдВрдЧ рдирд┐рд▓рдВрдмрд┐рдд рд╣реИред рдкрдврд╝рдиреЗ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдкрд╛рдЗрдк, рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ, рдпрд╛ рдбреЗрдЯрд╛ рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

_read рдПрдХ рдирд┐рдЬреА рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬрд┐рд╕реЗ рдкрдардиреАрдп рд╡рд░реНрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрд░реАрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рддрдм рддрдХ рд▓рдЧрд╛рддрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд╣рд╛рдИрд╡рд╛рдЯрд░рдорд╛рд░реНрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ред

рдЦреИрд░, рдЖрдЦрд┐рд░реА рддрд░реАрдХрд╛ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрд┐рдХрд░ рд▓рдЧрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдпрд╣ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдмрдлрд░ рднрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЭреВрдареА рд▓реМрдЯрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреАред рдЗрд╕реЗ рдкрдардиреАрдпред_ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЗрдП рдЕрдм рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВред

 class Counter extends Readable { constructor(opt) { super(opt); this._max = 1000; this._index = 0; } _read() { this._index += 1; if (this._index > this._max) { this.push(null); } else { const buf = Buffer.from(`${this._index}`, 'utf8'); console.log(`Added: ${this._index}. Could be added? `, this.push(buf)); } } } const counter = new Counter({ highWaterMark: 2 }); console.log(`Received: ${counter.read().toString()}`); 

рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдХрд╛рдЙрдВрдЯрд░рд░реЗрдб () рд╡рд╣ рд╡рд░реНрде рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдирд┐рдЬреА рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рд╕реЗ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:



рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ? рдирдпрд╛ рдХрд╛рдЙрдВрдЯрд░ ({highWaterMark: 2}) рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдордиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ 2 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддред 2 рдЕрдХреНрд╖рд░ (1 рд╡рд░реНрдг = 1 рдмрд╛рдЗрдЯ) рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рдЙрдВрдЯрд░.реНрд░реЗрдб () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрдЯреНрд░реАрдо рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХреЛ '1' рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдЙрд╕рдиреЗ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛, '2' рд▓рд┐рдЦрд╛ред рдЬрдм рдпрд╣ '3' рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдмрдлрд╝рд░ рдкреВрд░рд╛ рднрд░рд╛ рд╣реЛрдЧрд╛, рдкрдардиреАрдп.рдкреБрд╖ рдЭреВрдареЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдзрд╛рд░рд╛ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдореБрдХреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмрдлрд░ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреАред

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд░реАрдбрд┐рдВрдЧ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЗрдЯрд╛ рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рдореНрди рдХреЛрдб рд╕реЗ рдмрджрд▓реЗрдВред

 const counter = new Counter({ highWaterMark: 2 }); counter.on('data', chunk => { console.log(`Received: ${chunk.toString()}`); }); 

рдЕрдм рдпрджрд┐ рд╣рдо рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдФрд░ 1 рд╕реЗ 1000 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред

рд▓рд┐рдЦрд┐рдд рдзрд╛рд░рд╛


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдкрдардиреАрдп рдзрд╛рд░рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдирд╛ рд╣реИред

 const { Writable } = require('stream'); class myWritable extends Writable { constructor(opt) { super(opt); } _write(chunk, encoding, callback) {} } 

рдпрд╣ рдкрдардиреАрдп рд╕реНрдЯреНрд░реАрдо рдХреА рддрд░рд╣ рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо highWaterMark рдФрд░ _write рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

_write рдПрдХ рдирд┐рдЬреА рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрд░реАрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ 3 рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ: рдЪрдВрдХ (рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛), рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (рдЕрдЧрд░ рдЪрдВрдХ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ), рдХреЙрд▓рдмреИрдХ (рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдПрдХ рд╕рдлрд▓ рдпрд╛ рдЕрд╕рдлрд▓ рд▓реЗрдЦрди рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

highWaterMark рдЖрдВрддрд░рд┐рдХ рд╕реНрдЯреНрд░реАрдо рдмрдлрд░ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 16kb) рдХреА рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рд╕реНрдЯреНрд░реАрдоред рд░рд╛рдЗрдЯ рдЭреВрдареЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд▓рдЧреЗрдЧрд╛ред

рдЖрдЗрдП рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред

 const { Writable } = require('stream'); class Counter extends Writable { _write(chunk, encoding, callback) { console.log(chunk.toString()); callback(); } } const counter = new Counter({ highWaterMark: 2 }); for (let i = 1; i < 1000; i += 1) { counter.write(Buffer.from(`${i}`, 'utf8')); } 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ! рдирдпрд╛ рдХрд╛рдЙрдВрдЯрд░ ({highWaterMark: 2}) рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдордиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░ 2 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддред 2 рдЕрдХреНрд╖рд░ (1 рд╡рд░реНрдг = 1 рдмрд╛рдЗрдЯ) рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдХрд╛рдЙрдВрдЯрд░ рджрд╕ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рдмрдлрд╝рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рднрд░рд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрд░рдорд╢рдГ, рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдПрдХ рдзреАрдореА рд╕реНрд░реЛрдд рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдХреЙрд▓рд┐рдВрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдиреНрдп рд╕рднреА рдбреЗрдЯрд╛ рд░реИрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмреЗрд╢рдХ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдмрдлрд░ 2 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛)ред рдЬрдм рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдзрд╛рд░рд╛ рдбреЗрдЯрд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрддреА рд╣реИ, рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ (рдбреНрд░реЗрди рдЗрд╡реЗрдВрдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ) рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред

 const { Writable } = require('stream'); const { once } = require('events'); class Counter extends Writable { _write(chunk, encoding, callback) { console.log(chunk.toString()); callback(); } } const counter = new Counter({ highWaterMark: 2 }); (async () => { for (let i = 1; i < 1000; i += 1) { const canWrite = counter.write(Buffer.from(`${i}`, 'utf8')); console.log(`Can we write bunch of data? ${canWrite}`); if (!canWrite) { await events.once(counter, 'drain'); console.log('drain event fired.'); } } })(); 

рдЗрд╡реЗрдВрдЯреНрд╕ред рдСрди рд╡рд┐рдзрд┐ рдХреЛ v11.13.0 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рд╡рд╛рджрд╛ рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдмрдлрд░ рдХреЗ рдореБрдХреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВред

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 10GB рд╕реЗ рдЕрдзрд┐рдХ рд╡рдЬрди рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЗрдВ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреВрд▓ рдЬрд╛рдиреЗ рдкрд░, рдЖрдк рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреНрд╡реИрдз рдзрд╛рд░рд╛


рдпрд╣ рдкрдардиреАрдп рдФрд░ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдореЗрдВ рджреЛ _read рдФрд░ _write рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

 const { Duplex } = require('stream'); class myDuplex extends Duplex { constructor(opt) { super(opt); } _read(size) {} _write(chunk, encoding, callback) {} } 

рдпрд╣рд╛рдВ рд╣рдо 2 рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпреЗ рдкрдардиреАрдп рд╣реИрдВрд╣рд╡рд╛рдЯрд░рдореИрд░реНрдХ рдФрд░ рд░рд┐рд▓реЗрдЯреЗрдмрд▓рд╣рд╛рдЗрд╡рд╛рдЯрд░рдореИрд░реНрдХ, рдЬреЛ рд╣рдореЗрдВ рдХреНрд░рдорд╢рдГ рдкрдардиреАрдп, рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд┐рдЫрд▓реЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдбреБрдкреНрд▓реЗрдХреНрд╕ рд╕реНрдЯреНрд░реАрдо рдХреА рдорджрдж рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

 const { Duplex } = require('stream'); const events = require('events'); class Counter extends Duplex { constructor(opt) { super(opt); this._max = 1000; this._index = 0; } _read() { this._index += 1; if (this._index > this._max) { this.push(null); } else { const buf = Buffer.from(`${this._index}`, 'utf8'); this.push(buf); } } _write(chunk, encoding, callback) { console.log(chunk.toString()); callback(); } } const counter = new Counter({ readableHighWaterMark: 2, writableHighWaterMark: 2 }); (async () => { let chunk = counter.read(); while (chunk !== null) { const canWrite = counter.write(chunk); console.log(`Can we write bunch of data? ${canWrite}`); if (!canWrite) { await events.once(counter, 'drain'); console.log('drain event fired.'); } chunk = counter.read(); } })(); 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВред

рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рд╕реНрдЯреНрд░реАрдо


рдпрд╣ рдзрд╛рд░рд╛ рдПрдХ рджреНрд╡реИрдз рдзрд╛рд░рд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рдиреАрдЪреЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕реЗ рдмрд╛рдХреА рд╕реНрдЯреНрд░реАрдо рдХреА рддрд░рд╣ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 const { Transform } = require('stream'); class myTransform extends Transform { _ transform(chunk, encoding, callback) {} } 

рд╣рдо _transform рд╡рд┐рдзрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

_transform рдПрдХ рдирд┐рдЬреА рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рд╡рд░реНрдЧ рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ 3 рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ: рдЪрдВрдХ (рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛), рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (рдЕрдЧрд░ рдЪрдВрдХ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ), рдХреЙрд▓рдмреИрдХ (рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рд╕рдлрд▓ рдпрд╛ рдЕрд╕рдлрд▓ рд▓реЗрдЦрди рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдбреЗрдЯрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо.рдкреБрд╢ () рд╢реВрдиреНрдп рдпрд╛ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕рдм рдХреБрдЫ рднреЗрдЬ рджреЗрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ред рдЗрд╕ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо.рдкрд╢ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрджрд▓реЗ рд╣реБрдП рдбреЗрдЯрд╛ рдХреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди (рдЙрджрд╛рд╣рд░рдг: рдХреЙрд▓рдмреИрдХ (рдирд▓, рдбреЗрдЯрд╛)) рдХреЗ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬреЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕реНрдЯреНрд░реАрдо.рдкрд╛рдЗрдк рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред

stream.pipe - рдЗрд╕ рдореЗрдердб рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реАрдбреЗрдмрд▓ рд╕реНрдЯреНрд░реАрдо рдХреЛ Writable рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕реНрдЯреНрд░реАрдо рдЪреЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрджрд┐ред

рдЖрдЗрдП рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рд╕реНрдЯреНрд░реАрдо рд▓рд┐рдЦреЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ * рдХреИрд░реЗрдХреНрдЯрд░ рдЬреЛрдбрд╝реЗрдЧреАред

 class CounterReader extends Readable { constructor(opt) { super(opt); this._max = 1000; this._index = 0; } _read() { this._index += 1; if (this._index > this._max) { this.push(null); } else { const buf = Buffer.from(`${this._index}`, 'utf8'); this.push(buf); } } } class CounterWriter extends Writable { _write(chunk, encoding, callback) { console.log(chunk.toString()); callback(); } } class CounterTransform extends Transform { _transform(chunk, encoding, callback) { try { const resultString = `*${chunk.toString('utf8')}*`; callback(null, resultString); } catch (err) { callback(err); } } } const counterReader = new CounterReader({ highWaterMark: 2 }); const counterWriter = new CounterWriter({ highWaterMark: 2 }); const counterTransform = new CounterTransform({ highWaterMark: 2 }); counterReader.pipe(counterTransform).pipe(counterWriter); 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдкрдардиреАрдп рдФрд░ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рднреА рдЬреЛрдбрд╝рд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдирд┐рдХрд▓рд╛ред

рддреЛ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдзрд╛рд░рд╛рдУрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЙрдирдХреА рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдмрдбрд╝реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИред

Source: https://habr.com/ru/post/hi479048/


All Articles