Request: рддреНрд░реБрдЯрд┐: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдкрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЕрдкреНрд░реИрд▓ 2014  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: request/request

рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдкрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред" рд░рд╛рдЗрдЯрд╕реНрдЯреНрд░реАрдо рдкрд░ рдкрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ред рдпрд╣ рдХреЗрд╡рд▓ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм request() рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдФрд░ readStream.pipe(writeStream) рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмреАрдЪ рд╡рд┐рд▓рдВрдм рд╣реБрдЖ рд╣реЛред

рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг: v0.10.24
рдЕрдиреБрд░реЛрдз рд╕рдВрд╕реНрдХрд░рдг: 2.34.0

рдореИрдВрдиреЗ рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд┐рдердм рд░реЗрдкреЛ рдмрдирд╛рдпрд╛ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
https://github.com/joe-spanning/request-error

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рднреА рдиреАрдЪреЗ рд╣реИ:

var fs = require('fs'),
  request = require('request');

var readStream = request({
  url: 'https://gist.githubusercontent.com/joe-spanning/6902070/raw/8967b351aec744a2bb51c16cb847c44636cf53d9/pipepromise.js'
});

// wait for 5 seconds, then pipe
setTimeout(function() {

  var writeStream = readStream.pipe(fs.createWriteStream('test.js'));

  writeStream.on('finish', function() {
    console.log('all done!');
  });

  writeStream.on('error', function(err) {
    console.error(err);
  });

}, 5000);

рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред

/request-error/node_modules/request/request.js:1299
      throw new Error("You cannot pipe after data has been emitted from the re
            ^
Error: You cannot pipe after data has been emitted from the response.
    at Request.pipe (/request-error/node_modules/request/request.js:1299:13)
    at null._onTimeout (/request-error/pipe-error.js:16:32)
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@ joepie91 рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рдФрд░ рддреБрд░рдВрдд рдПрдХ PassThrough рдкрд░ рдкрд╛рдЗрдк рдХрд░рдирд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЪрд▓рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ?

var fs = require('fs'),
  request = require('request');

var readStream = request({
  url: 'https://gist.githubusercontent.com/joe-spanning/6902070/raw/8967b351aec744a2bb51c16cb847c44636cf53d9/pipepromise.js'
})
.pipe(require('stream').PassThrough());  // this line is the only modification

// wait for 5 seconds, then pipe
setTimeout(function() {

  var writeStream = readStream.pipe(fs.createWriteStream('test.js'));

  writeStream.on('finish', function() {
    console.log('all done!');
  });

  writeStream.on('error', function(err) {
    console.error(err);
  });

}, 5000);

рд╕рднреА 29 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕реЗ рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдФрд░ рдХреНрдпрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ request.js рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ:

рдЬреЛрдбрд╝реЗрдВ:

var superOn = Request.prototype.on;
Request.prototype.on = function (eventName) {
  if (eventName === "data") {
    this.resume()
  }
  superOn.apply(this, arguments)
}

рдФрд░ dataStream.on("data" рдХреЙрд▓ рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓реЗрдВ:

dataStream.on("data", function (chunk) {
      var emitted = self.emit("data", chunk)
      if (emitted) {
        self._destdata = true
      } else {
        // pause URL stream until we pipe it
        dataStream.pause()
        dataStream.unshift(chunk)
      }
})

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

рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдирд╣реАрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдмрд╕ request рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ Node.js http рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдореБрдЭреЗ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореЗрд░рд╛ рдлрд┐рдХреНрд╕ рдЕрдиреБрд░реЛрдз 2.37.0.0.1 рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдкреБрд░рд╛рдиреЗ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

@aldeed рдореИрдВрдиреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлреЛрд░реНрдХ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЖрдкрдХрд╛ рдлрд┐рдХреНрд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ: https://github.com/joepie91/requestред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ (рдореВрд▓) рднрдВрдбрд╛рд░ рдХрд┐рд╕ рд╣рдж рддрдХ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рд╡рд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реА рд╣реВрдВред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рддрдм рддрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдвреВрдВрдв рдкрд╛ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣реА рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рддрдХрдиреАрдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИред

request рдЗрд╕ рдЕрд░реНрде рдореЗрдВ 'рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдПрдкреАрдЖрдИ' рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк .pipe рдореВрд▓ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ WritableStream ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдирд╣реАрдВ рд╣реИ, request 'shims' data рдИрд╡реЗрдВрдЯ - рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдкрд░ data рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЛрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрд░реЛрдз рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИред

рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдЬреИрд╕реЗ рд╣реА рдЖрдк рдХрд┐рд╕реА рд╕реНрдЯреНрд░реАрдо рдХреЗ data рдИрд╡реЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝рддреЗ рд╣реИрдВ, рд╡рд╣ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИ ред

рдЕрдм рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ; Node.js 'рдЯрд┐рдХ' рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ 'рд╕рд╛рдЗрдХрд┐рд▓' рдорд╛рдиреЗрдВред рд╕рд░рд▓реАрдХреГрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ 'рдЯрд┐рдХ' рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рдЕрдЧрд▓реА рдЯрд┐рдХ рддрдХ рдХреЛрдИ рднреА рдИрд╡реЗрдВрдЯ рдЪреЗрдХ рдпрд╛ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд▓реНрдкрдирд┐рдХ рдХреЛрдб рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

stream = getSomeRequestStream();
stream.pipe(target);

рджреЛрдиреЛрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рдЯрд┐рдХ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реА data рдШрдЯрдирд╛ рд╕рдВрднрд╡рддрдГ рдЕрдЧрд▓реЗ рдЯрд┐рдХ рддрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдЗрд╕ рддрд░рд╣ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ .pipe рдХреЛ рдкрд╣рд▓реЗ data рдИрд╡реЗрдВрдЯ рдХреЗ _before_ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЕрдм, рдЬреЛ-рд╕реНрдкреИрдирд┐рдВрдЧ рдиреЗ рдЬреЛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╡рд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдерд╛, рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯред рд╕реНрдЯреНрд░реАрдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ .pipe рдЕрдм рдХреЛрдб рдХреЗ рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред

рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд░реНрдорд╛рдг рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗ рд╕рдВрднрд╡рддрдГ рдЕрдЧрд▓реЗ рдЯрд┐рдХ рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рддрдХ рдЖрдкрдХрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд░реНрдорд╛рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддрдм рддрдХ рдШрдЯрдирд╛ рдЪрдХреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓рд╛ data рдИрд╡реЗрдВрдЯ _already_ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдбреЗрдЯрд╛ рдХрд╛ рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрдЯреНрд░реАрдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдЖрдкрдХреЗ .pipe рдмреАрдЪ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЖрддрд╛ рд╣реИред request рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ data рдИрд╡реЗрдВрдЯ рдкрд╣рд▓реЗ рд╣реА рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдЖрдк .pipe рд╕реНрдЯреНрд░реАрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛ рдЪреБрдХреА рд╣реИред

рдпрд╣реА рд╕рдорд╕реНрдпрд╛ _anything_ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░реАрдо рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЯрд┐рдХ рдмрд╛рдж рдореЗрдВ рд╣реЛрддреА рд╣реИред

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

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ data рдЗрд╡реЗрдВрдЯ рд╢рд┐рдо request рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рджреЛрд╖ рд╣реИред рдпрд╣ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдЯрд┐рдХ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдкрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ Node.js рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИ (рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдлрд┐рдХреНрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдореВрд▓ рд╕реНрдЯреНрд░реАрдо рдкрд░ data рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рддрдм рддрдХ рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рд╢реНрд░реЛрддрд╛ рд╕рдВрд▓рдЧреНрди рди рд╣реЛ рдЬрд╛рдПред

рдПрдХ рдЖрдЦрд┐рд░реА рдиреЛрдЯ; рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдзрд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ request рдПрдХ data рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реНрд╡рдпрдВ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдмреЙрдбреА рдХреЛ рдкрдврд╝реЗрдЧрд╛, рдФрд░ рдЖрдкрдХреЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рдмреЙрдбреА рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХрд╛ рддрд░реАрдХрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп response рдИрд╡реЗрдВрдЯ рд╕реЗ рдЕрдЯреИрдЪ рдХрд░рдирд╛ рд╣реИ (рдФрд░ рдХреЙрд▓рдмреИрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ)ред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реА рдпрд╣ рдШрдЯрдирд╛ (рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ) рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдЕрдиреБрд░реЛрдз рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

@aldeed рдореИрдВ рдЗрд╕реЗ рдШрдВрдЯреЛрдВ рддрдХ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рд╕рднреА рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЕрдм рдореИрдВ рдЕрдВрддрддрдГ рдЕрдкрдиреА рдЪреАрдЬрд╝ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭ рдкрд░ рдЖрдкрдХреА рдПрдХ рдмреАрдпрд░ рдЙрдзрд╛рд░ рд╣реИ :)

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд╡рд░рд┐рдд рдиреЛрдЯ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирдИ рд╢реИрд▓реА рдХреА рдзрд╛рд░рд╛ рдФрд░ 3.0 рд╢рд╛рдЦрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

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

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдЧрд▓реЗ рдЯрд┐рдХ () рд╣реИрдХ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдирд┐рдкрдЯрд╛рдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЬреЛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рд╡рд╣ рдкрд╣рд▓реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ() рдФрд░ рдлрд┐рд░ рд╕рднреА "рдЖрд▓рд╕реА" рдХреЛрдб рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдВред

рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ 3.0 рдореЗрдВ рдпрджрд┐ рдЖрдк рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрдлрд░ рдХрд░ рджреЗрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрдлрд░рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рдЯрд┐рдХ рд╣реИрдХ рдХреЗ рдмрд┐рдирд╛ рд╣рдо рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

@mikael рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдлрд┐рдХреНрд╕ рдХреЛ рд╡рд░реНрддрдорд╛рди рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ?

рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рдкреАрдЖрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдареАрдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдирд┐рд░реНрдорд╛рдг рдХреЛ @aldeed рддрдХ рдЫреЛрдбрд╝рдирд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЙрд╕рдиреЗ рдореВрд▓ рдлрд┐рдХреНрд╕ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рд╣реИ - рдЗрд╕реЗ рдореБрдЦреНрдп рднрдВрдбрд╛рд░ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░рдирд╛ рд╢рд╛рдпрдж рдЙрд╕рдХреА рдкрд╕рдВрдж, рд▓рд╛рдЗрд╕реЗрдВрд╕рд┐рдВрдЧ-рд╡рд╛рд░ рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдзрдиреНрдпрд╡рд╛рдж, @ рдЬреЛрдкреА 91ред @mikeal , рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ 2.37.0 рдореЗрдВ рдХреЛрдб рдкрдврд╝рд╛, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдИ рд╢реИрд▓реА рдХреА рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ "рд░реЛрдХреЗ рдФрд░ рдмрдлрд░" рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рд╢реБрд░реБрдЖрдд рдореЗрдВред рд╕рдорд╕реНрдпрд╛ рддрдм рдЖрддреА рд╣реИ рдЬрдм рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ "рдбреЗрдЯрд╛" рд╢реНрд░реЛрддрд╛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд░реАрдбрд╕реНрдЯреНрд░реАрдо рдХреЛ рдЦреБрдж рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рддреЛ рдЬреИрд╕рд╛ рдХрд┐ @ joepie91 рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рд╕рдЪреНрдЪреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреИрд╕реЗ рдХрд┐ рдЖрдк "рдбреЗрдЯрд╛" рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдбреЙрдХреНрд╕ рд╕реЗ :

рдиреЛрдб v0.10 рдореЗрдВ, рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдкрдардиреАрдп рд╡рд░реНрдЧ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдкреБрд░рд╛рдиреЗ рдиреЛрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рдкрд╢реНрдЪ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдЬрдм рдХреЛрдИ 'рдбреЗрдЯрд╛' рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЬрдм рдкреЙрдЬрд╝ () рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд░реАрдбреЗрдмрд▓ рд╕реНрдЯреНрд░реАрдо "рдлреНрд▓реЛрдЗрдВрдЧ рдореЛрдб" рдореЗрдВ рд╕реНрд╡рд┐рдЪ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдкреНрд░рднрд╛рд╡ рдпрд╣ рд╣реИ рдХрд┐, рднрд▓реЗ рд╣реА рдЖрдк рдирдИ рд░реАрдб () рд╡рд┐рдзрд┐ рдФрд░ 'рдкрдардиреАрдп' рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рдлрд┐рд░ рднреА рдЖрдкрдХреЛ 'рдбреЗрдЯрд╛' рднрд╛рдЧ рдЦреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рд╢рд╛рдпрдж рдЧрд▓рдд рдкрдврд╝рд╛ рд╣реИ рдпрд╛ рдореИрдВ рдЧрд▓рдд рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдпрд╛ рдореИрдВрдиреЗ 3.0 рдХреЛрдб рднреА рджреЗрдЦрд╛, рдФрд░ рднреНрд░рдорд┐рдд рд╣реЛ рдЧрдпрд╛ред :)

рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рдорд╛рдзрд╛рди stream.PassThrough() рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рддреБрд░рдВрдд рдкрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдордп рдкрд╛рд╕рдереНрд░реВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдкрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рджреЗрдЦреЗрдВ: http://nodejs.org/api/stream.html#stream_class_stream_passthrough

@ZJONSSON рдореИрдВрдиреЗ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рдорд╛рди рд╕реАрдорд╛ (рдмрд╛рдж рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдЕрдЯреИрдЪрдореЗрдВрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдкреБрди: рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ) рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдореВрд▓ рдЕрдиреБрд▓рдЧреНрдирдХ request рдФрд░ request рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рд▓рдЧрд╛рд╡ рдПрдХ рд╣реА рдЯрд┐рдХ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

@ joepie91 рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рдФрд░ рддреБрд░рдВрдд рдПрдХ PassThrough рдкрд░ рдкрд╛рдЗрдк рдХрд░рдирд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЪрд▓рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ?

var fs = require('fs'),
  request = require('request');

var readStream = request({
  url: 'https://gist.githubusercontent.com/joe-spanning/6902070/raw/8967b351aec744a2bb51c16cb847c44636cf53d9/pipepromise.js'
})
.pipe(require('stream').PassThrough());  // this line is the only modification

// wait for 5 seconds, then pipe
setTimeout(function() {

  var writeStream = readStream.pipe(fs.createWriteStream('test.js'));

  writeStream.on('finish', function() {
    console.log('all done!');
  });

  writeStream.on('error', function(err) {
    console.error(err);
  });

}, 5000);

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд╣реВрдВ рддреЛ рдореБрдЭреЗ рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореБрдЭреЗ рд╕рд╣реА рд╕реЗ рдпрд╛рдж рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдареАрдХ рдпрд╣реА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖред рдХреНрдпрд╛ рдЗрд╕ рдмреАрдЪ рд╢рд╛рдпрдж request рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдб рдмрджрд▓ рдЧрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @ рдЬреЛ-рд╕реНрдкреИрдирд┐рдВрдЧ рдХрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕рдореЗрдВ рдФрд░ рдореЗрд░реЗ рдХреЛрдб рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

Submitted PR #1098

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реНрд╡рдпрдВ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдмреЙрдбреА рдХреЛ рдкрдврд╝реЗрдЧрд╛, рдФрд░ рдмреЙрдбреА рдХреЛ рдЖрдкрдХреЗ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдЖрдкреВрд░реНрддрд┐ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХрд╛ рддрд░реАрдХрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдирд╛ рд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рд╣реИ> (рдФрд░ рдХреЙрд▓рдмреИрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдирд╛)ред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реА рдпрд╣ рдШрдЯрдирд╛ (рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ) рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рдЕрдиреБрд░реЛрдз рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рдореБрдЭреЗ рдЕрднреА-рдЕрднреА request(url, mycb).pipe(mywstream) . рдиреЗ рдХрд╛рдЯ рд▓рд┐рдпрд╛ рд╣реИ
рдХрднреА-рдХрднреА mycb рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдирд╣реАрдВред
рд╢рд╛рдпрдж рдЕрдиреБрд░реЛрдз рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде pipe() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп, рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рддрдм рдорд┐рд▓рддреА рд╣реИ рдЬрдм рдореИрдВ .pipe рдореЗрдВ .on('response') рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ:

req = request(options)
req.on 'response', (response) ->
  # get info from headers here
  stream = createWriteStream file
  req.pipe stream

рдореЗрд░реА рддрд░рдл рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпреЛрдВ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдордп рдкрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрдиреЗ рдФрд░ request рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдмрдЧреЛрдВ рдХреЗ рдЪрд▓рддреЗ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦреА рд╣реИ рдЬреЛ рдЗрд╕ рдЙрдкрдпреЛрдЧрдХреЗрд╕ рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рдкрдЯрддреА рд╣реИ; bhttp ред рдпрд╣ Streams2 рд╕рдорд░реНрдерди рдореБрджреНрджреЛрдВ рдХреЛ рднреА рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ?

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ ( @dogancelik рдХреЗ рд╕рдорд╛рди, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рдЗрдк рдХрд░рдирд╛), рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:

const req = request.get(URL);
req.on('response', (response) => {
    response.pause();
    // Do stuff with response.statusCode etc.
    setTimeout(() => {
        response
        .pipe(process.stdout)
        ;
    }, 2000);
});

рдпрд╛рдиреА, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд░реЛрдХрдирд╛ ( request рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрд╣рдиреЗ рд╡рд╛рд▓реЗ рдореЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ?) рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рдкрд╛рдЗрдк рдХрд░рдирд╛ ( req )ред

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭрд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реВрдБред

рдмрд╕ рдЗрд╕ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВ... рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреА рдУрд░ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐ рдереАред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд░рдгреА рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рд╕рд╛рде рдХрдИ рдЕрдиреБрд░реЛрдз рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдБред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рд╕реНрдд рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддрд╛ рд╣реИ;

unzipper = function() {
    var self = this;

    /**
     * Properties
     */
    this.req = [];
    this.aborted = [];
    /* */

    /**
     * Methods
     */
    this.download = function(id, onProgress, onSuccess, onError, onAbort){

        var newinstanceAbort = {
          id: id,
          abort: false
        };

        this.aborted.push(newinstanceAbort);

        var url = '...';
        var target = '...';

        var request = require('request');
        var j = request.jar();
        var progress = require('request-progress');
        var cookie = request.cookie(app.session.sessionName + '=' + app.session.sessionId);
        j.setCookie(cookie, url);

        var downloadRequest = {
          id: id,
          request: request({url: url, jar: j})
        };

        this.req.push(downloadRequest);

        var instanceRequest = app.findObject(this.req, id);
        var instanceAbort = app.findObject(this.aborted, id);

        progress(instanceRequest.request, {
            throttle: 10,
        })
        .on('progress', function (state) {
            var progress = Math.round(state.percent * 100);
            onProgress(progress);
        })
        .on('error', function (err) {
            onError(err);
        })
        .on('end', function (e) {
            if(instanceAbort.abort) {
                onAbort();
            } else {
                onSuccess();
            }

            /**
             * Remove the unique request object from the req to complete the request
             *
             * If this is not done, the request would throw "You cannot pipe after data has been emitted from the response" as it is constantly re-emitting the same request
             */
            self.complete(id);

        })
        .pipe(app.fs.createWriteStream(target));
    };



    this.abort = function(id){
        var instanceAbort = app.findObject(this.aborted, id);
        var instanceRequest = app.findObject(this.req, id);

        instanceRequest.request.abort();
        instanceAbort.abort = true;
    };

    this.complete = function(id){
        var index = this.req.map(function(x){ return x.id; }).indexOf(id);

        this.req.splice(index, 1);
    };
    /* */

};

@ рдЬреВрд▓рд┐рдпрди-рд╕реА рдЕрдЪреНрдЫреА рдХреЙрд▓, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ response рд╢реНрд░реЛрддрд╛ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ "рдлреНрд▓реЛрдЗрдВрдЧ рдореЛрдб" рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ [email protected] рдФрд░ [email protected] рджреЛрдиреЛрдВ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИред

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

рдореИрдВ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдбреЙрдЧреЗрдВрд╕реЗрд▓рд┐рдХ рдХреА рддрд░рд╣ рд╣реА рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдкрд╛рдЗрдкрд┐рдВрдЧ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рдЖрдк request.js рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдкрдиреЗ "рдбреЗрдЯрд╛" рд╣реИрдВрдбрд▓рд░ (рдЬреЛ рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ) рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрд▓рдЧреНрди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛" рдШрдЯрдирд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрддреА рд╣реИ:

self.emit('response', response)

self.dests.forEach(function (dest) {
  self.pipeDest(dest)
})

responseContent.on('data', function (chunk) {
  if (self.timing && !self.responseStarted) {
    self.responseStartTime = (new Date()).getTime()

    // NOTE: responseStartTime is deprecated in favor of .timings
    response.responseStartTime = self.responseStartTime
  }
  self._destdata = true
  self.emit('data', chunk)
})

рдЪреВрдВрдХрд┐ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЦрдкрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рдЗрдк рд╕рдВрд▓рдЧреНрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

let rp = require('request-promise');
let options = {uri: 'http://a-url-pointing-online-pdf-link'};

koaRouter.get('/api/url/download', async(ctx, next) => {
        try {
            ctx.set('Content-disposition', 'attachment;filename=a.pdf');
            ctx.body = rp(options);  
        } catch (e) {
            ctx.body = e;
        }
    })   

рдФрд░ рдореИрдВ PassThrough рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдИрдбреА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдЖрдИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ passthrough рд╣рд▓ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реЗ рд╕рднреА рдХреЛрдб рдХреЛ рдЙрд╕реА 'рдЯрд┐рдХ' рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

let rp = require('request-promise');
let stream = require('stream');
let options = {uri: 'http://a-url-pointing-online-pdf-link'};

koaRouter.get('/api/url/download', async(ctx, next) => {
        try {
            ctx.set('Content-disposition', 'attachment;filename=a.pdf');
            let pass = stream.PassThrough();
            rp(options).pipe(pass);
            ctx.body = pass;
        } catch (e) {
            ctx.body = e;
        }
    })   

рдЕрдиреБрд░реЛрдз рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рднреА рд╕рдорд╛рди рдмрдЧ рдореМрдЬреВрдж рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ write рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ pipe рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдореИрдВрдиреЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдХреЛрд░ http/https рдореЙрдбреНрдпреВрд▓ рдкрд░ рднреА рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ред рдпрд╣ рдЖрд╕рд╛рди рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред рддреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП request рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкрд╛рдЗрдк рди рдХрд░реЗрдВ рджреВрд░рднрд╛рд╖ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдИрдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
`рд╡рд░ рдЕрдиреБрд░реЛрдз = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдЕрдиреБрд░реЛрдз');
рд╡рд░ рдПрдлрдПрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдПрдлрдПрд╕');
рд╡рд░ рдкрде = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдкрде');

рдбрд╛рдЙрдирд▓реЛрдбрдлрд╛рдЗрд▓ (file_url, рд▓рдХреНрд╖реНрдпрдкрде) {
// рдкреНрд░рдЧрддрд┐ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рд╕рд╣реЗрдЬреЗрдВ

var _self = this;
var received_bytes = 0;
var total_bytes = 0;

var req = request({
    method: 'GET',
    uri: file_url
});

var out = fs.createWriteStream(targetPath);
**///////////////MOVE THIS LINE  FROM HERE TO ///////////////////

////////////// рдЕрдиреБрд░реЛрдз рдкрд░ ('рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛', рд╕рдорд╛рд░реЛрд╣ (рдбреЗрдЯрд╛)///////
////////////////////////req.pipe (рдмрд╛рд╣рд░);//////////////// //////////////**

req.on('response', function ( data ) {
    **### req.pipe(out);**
    // Change the total bytes value to get progress later.
    total_bytes = parseInt(data.headers['content-length' ]);
});

req.on('data', function(chunk) {
    // Update the received bytes
    received_bytes += chunk.length;

    _self.showProgress(received_bytes, total_bytes);
    var percentage = (received_bytes * 100) / total_bytes;
    console.log(percentage + "% | " + received_bytes + " bytes out of " + total_bytes + " bytes.");

});

req.on('end', function() {
    alert("File succesfully downloaded");
});

}`

рдЕрдиреБрд░реЛрдз рдЕрдм рд░рдЦрд░рдЦрд╛рд╡ рдореЛрдб рдореЗрдВ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдорд░реНрдЬ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ #3142 рджреЗрдЦреЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

matrosov-nikita picture matrosov-nikita  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chenby picture chenby  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jdarling picture jdarling  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

svlungade picture svlungade  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

andornaut picture andornaut  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ