Request: POST рдмреЙрдбреА рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдкрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЬреВрди 2015  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: request/request

рдореИрдВ рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЕрдиреБрд░реЛрдз рд╕реЗ рдкрд╛рдЗрдкрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдпрд╣ рдЬреАрдИрдЯреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╢рд░реАрд░ рд╣реИ, рд╢рд░реАрд░ рдХреЛ рдирдП рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рд╢рд░реАрд░ рдкрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:

let pipedReq = req.pipe(request({ url: 'http://www.example.com', form: req.body }));

рдпрд╣ рд╢рд░реАрд░ рдкрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рддрдм рдореБрдЭреЗ "рдЕрдВрдд рдХреЗ рдмрд╛рдж рд▓рд┐рдЦрдирд╛" рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдЬрдм pipedReq рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред #1659 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдРрдк рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:

'use strict';

let express = require('express');
let request = require('request');

let app = express();

app.use('/', (req, res) => {
  req.pipe(request.post({ url: 'http://www.example.com', form: { foo: 'bar' }}));
});

app.listen(process.env.PORT || 3000);

рдмреИрдХрдЯреНрд░реЗрд╕:

Error: write after end
    at ClientRequest.OutgoingMessage.write (_http_outgoing.js:413:15)
    at Request.write (/.../node_modules/request/request.js:1354:25)
    at end (/.../node_modules/request/request.js:548:16)
    at Immediate._onImmediate (/.../node_modules/request/request.js:576:7)
    at processImmediate [as _immediateCallback] (timers.js:358:17)

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

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реБрдИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

'use strict';

let express = require('express');
let request = require('request');

let app = express();

app.use('/', (req, res) => {
  req.pipe(request.post({ url: 'http://www.example.com', form: { foo: 'bar' }}), {end: false}).pipe(res);
});

app.listen(process.env.PORT || 3000);

рдЬреИрд╕рд╛ рдХрд┐ https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдРрд╕рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрдм req рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдирдИ рд╕реНрдЯреНрд░реАрдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдмрдирд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рд╢рд░реАрд░ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рд╕рдм рдХреБрдЫ рдареАрдХ рд╕реЗ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд░реАрд░ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдЕрднреА рднреА рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдПрдХ рдЬреЗрд╕рди рдмреЙрдбреА рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд╢рд░реАрд░ рдХреЛ {} рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдИ рд╢рд░реАрд░ рди рд╣реЛ, рд▓реЗрдХрд┐рди рдПрдХ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдЕрдиреБрд░реЛрдз рдкрд░ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдореМрдЬреВрдж рд╣реИ рддреЛ рд╡рд┐рдХрд▓реНрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

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

рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

var express = require('express')
var request = require('request')

var app = express()

// put it before any other middleware
app.use(function(req, res) {
  req.pipe(
    request[req.method.toLowerCase()]('http://example.com'))
  .pipe(res)
})

app.listen(3000, function () {
  console.log('Express server listening on port 3000')
})

рдпрджрд┐ рдЖрдк рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдФрд░ рдкрд╛рдЗрдк рдмрдирд╛рдПрдВред

@simov рдореИрдВ рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдмрд╕ рдпреВрдЖрд░рдПрд▓ред рддреЛ рдореИрдВ рдореВрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдФрд░ рдЕрдиреНрдп рдЧреБрдгреЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдПрдХ рдирдП рдпреВрдЖрд░рдПрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдирдП рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореВрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдирдП рдореЗрдВ рдкрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╢рд░реАрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ), рдФрд░ рдпрджрд┐ рдореИрдВ form рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╢рд░реАрд░ рдХреЛ рдЕрдкрдиреЗ рдКрдкрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ request рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдореБрдЭреЗ рдКрдкрд░ рдмрддрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

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

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

рдореИрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдпрд╛ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ (рдХреЗрд╡рд▓ рдПрдХ-рдкреГрд╖реНрда рдРрдк рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд▓рд┐рдП рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдордЭреЗ рдмрд┐рдирд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП write after end рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛:

request.post({ url: 'http://www.example.com', form: { foo: 'bar' }}).pipe(res);

рдХреЗ рдмрдЬрд╛рдП:

req.pipe(request.post({ url: 'http://www.example.com', form: { foo: 'bar' }})).pipe(res);

@matthewgertner рдмрд╕ рдореЗрд░рд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЖрдЬрд╝рдорд╛рдПрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

@matthewgertner рддреБрдо рдореБрдЭреЗ рд╡рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдЕрдкрдиреЗ _exact_ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

@simov рдпрд╣ рдореЗрд░реА рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдирдореВрдирд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рд╢рд░реАрд░ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ:

'use strict';

let express = require('express');
let request = require('request');

let app = express();

app.use('/', (req, res) => {
  req.pipe(request.post('http://www.example.com'));
});

app.listen(process.env.PORT || 3000);

рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╡рд╣ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ:

'use strict';

let express = require('express');
let request = require('request');

let app = express();

app.use('/', (req, res) => {
  req.pipe(request.post({ url: 'http://www.example.com', form: { foo: 'bar' }}));
});

app.listen(process.env.PORT || 3000);

рдХреНрдпрд╛ рдЖрдк http://www.example.com рдХреЛ http://requestb.in/ рд╕реЗ рдХреБрдЫ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рд▓рд┐рдВрдХ рдпрд╣рд╛рдВ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП http://requestb.in/1mv5l8h1?inspect

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

var request = require('request')
request.post('http://localhost:3000', {form:{some:'data'}})

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдореЗрд░реЗ рд▓рд┐рдВрдХ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдореЗрд░реЗ рдкрд╛рд╕ form:{some:'data'} рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рджреЛред рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рдПрдкреАрдЖрдИ рдкреНрд░реЙрдХреНрд╕реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ (рджреЗрдЦреЗрдВ https://github.com/salsita/web-api-proxy)ред рдпрд╣ рдХреЗрд╡рд▓ HTTP рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╣реЛрд╕реНрдЯ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдкрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╕рд╛рде URL рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдмрд┐рдВрджреБ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

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

req.pipe(request.post('http://some/new/url'));

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ req рдореЗрдВ рдПрдХ рд╢рд░реАрд░ рд╣реИ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдФрд░ рд╡реИрд╕реЗ рднреА, рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ _do_ рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

req.pipe(request.post({ url: 'http://some/new/url', form: { some: 'form', data: 'here' }));

рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдЬреЛ рд╕рдВрджреЗрд╣ рд╣реИ, рдЙрд╕рдХреЗ рдХрд╛рд░рдг рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ request ред

рд╡реИрд╕реЗ рднреА, рдореИрдВ рд╕реНрд╡рдпрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ request рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ред

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ GET рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВред

request[req.method.toLowerCase()]('http://example.com')) рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдпрджрд┐ рдЖрдк рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдФрд░ рдкрд╛рдЗрдк рдмрдирд╛рдПрдВред

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ GET рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВред

рд▓реЗрдХрд┐рди рдореИрдВ request.post рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рд╡рд╣реА рдмрд╛рдд рд╣реИ request['post'] ред

рдпрджрд┐ рдЖрдк рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдирдпрд╛ рдЕрдиреБрд░реЛрдз рдФрд░ рдкрд╛рдЗрдк рдмрдирд╛рдПрдВред

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

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

рдпрд╣ рд╣рдореЗрд╢рд╛ GET рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХреБрдЫ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдирдИ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рддрднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд░реНрддрдорд╛рди рдХреЛрдбрдмреЗрд╕ POST рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрдм рдореИрдВ рдпрд╣рд╛рдВ рдмрддрд╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдХреЛрдбрдмреЗрд╕ рдХрд╛ рд╕рдВрджрд░реНрдн рджрд┐рдпрд╛ред

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рднрд▓реЗ рд╣реА рдореИрдВ рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╢рд░реАрд░ рдХреЛ рдкрд╛рдЗрдк рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛? рдЖрдкрдХреЛ рдЙрд╕ рдирд┐рдХрд╛рдп рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк request рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдирдИ рд╡рд╕реНрддреБ рдореЗрдВ рд╢рд░реАрд░ undefined рд╣реИред

GET рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдХреЛрдИ рдмреЙрдбреА рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣реИред

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг):

'use strict';

let express = require('express');
let request = require('request');

let app = express();

app.use('/', (req, res) => {
  req.pipe(request.post('http://www.example.com'));
});

app.listen(process.env.PORT || 3000);

рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

var request = require('request')
request.post('http://localhost:3000', {form:{some:'data'}})

some=data рднреЗрдЬрд╛ рдЧрдпрд╛ред

рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдирдИ рд╡рд╕реНрддреБ рдореЗрдВ рд╢рд░реАрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

рд╡рд╣ рдХрд╣рд╛рдБ рд╣реИ, рдореИрдВ рддреБрдореНрд╣рд╛рд░рд╛ рдкреАрдЫрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рд╣рдореНрдо рдареАрдХ рд╣реИред рдЬрдм рдореИрдВ requestb.in (рдЕрдЪреНрдЫреА рдпреБрдХреНрддрд┐!) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд░реАрд░ _is_ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ (рдФрд░ рдЕрднреА рднреА рд╣реИрдВ) рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЗрд╕реЗ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛:

1) рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рдпрд╣ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рд▓рдЯрдХрддрд╛ рд╣реИ (рдпрд╛рдиреА рдХрд░реНрд▓ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)ред
2) рдЬрдм рдореИрдВ request.body рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ undefined рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдореИрдВ request.post рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ form рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 2) рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдФрд░ рд╢рд░реАрд░ рдмрд╕ рдХрд╣реАрдВ рдФрд░ рдЬрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдЖрдк 1 рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдпрджрд┐ рдЖрдк рдХрд░реНрд▓ ( curl --data "some=data" localhost:3000 ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ localhost:3000 рдкрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд╣реИрдВрдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ?

1) рдЕрдиреБрд░реЛрдз рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ .pipe(res) ред
2) request.body рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп undefined рд╣реИ

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

app.use(bodyParser.urlencoded({ extended: true }));

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ body-parser рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкрд╛рдЗрдкрд┐рдВрдЧ рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╕рд╣рдордд рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдВ, рдЕрдЧрд░ рдЖрдк рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд░реЗрдВ:

// рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦреЗрдВ

body-parser рдЖрдкрдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдУрд╣! рдареАрдХ рд╣реИ, рдЖрдкрдХреА рдорджрдж рдФрд░ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж _a ton_ред рдЗрд╕рдХреА рддрд╣ рддрдХ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрд╛ред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ рдмрдХрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдореИрдВ рд╕рднреА рд╢реАрд░реНрд╖рд▓реЗрдЦреЛрдВ рдФрд░ рд╕рд╛рдорд╛рдиреЛрдВ рдореЗрдВ рдкрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ рдлрд┐рд░ рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред

@рд╕рд┐рдореЛрд╡

app.use(function(req, res) {
  req.pipe(
    request[req.method.toLowerCase()]('http://example.com'))
  .pipe(res)
})

DELETE рдХреЗ рд▓рд┐рдП рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ request.del рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ req.delete рдирд╣реАрдВ рд╣реИ

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реБрдИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

'use strict';

let express = require('express');
let request = require('request');

let app = express();

app.use('/', (req, res) => {
  req.pipe(request.post({ url: 'http://www.example.com', form: { foo: 'bar' }}), {end: false}).pipe(res);
});

app.listen(process.env.PORT || 3000);

рдЬреИрд╕рд╛ рдХрд┐ https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдРрд╕рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЬрдм req рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдирдИ рд╕реНрдЯреНрд░реАрдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдмрдирд╛рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рд╢рд░реАрд░ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рд╕рдм рдХреБрдЫ рдареАрдХ рд╕реЗ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд░реАрд░ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдЕрднреА рднреА рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдПрдХ рдЬреЗрд╕рди рдмреЙрдбреА рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд╢рд░реАрд░ рдХреЛ {} рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдИ рд╢рд░реАрд░ рди рд╣реЛ, рд▓реЗрдХрд┐рди рдПрдХ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдЕрдиреБрд░реЛрдз рдкрд░ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдореМрдЬреВрдж рд╣реИ рддреЛ рд╡рд┐рдХрд▓реНрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

@JeffreyAngell рдмрд╕ рдЕрдкрдиреЗ рд╕рдВрдХрд▓реНрдк рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
`рд░рд╛рдЙрдЯрд░.рдкреБрдЯ ('/', рдлрд╝рдВрдХреНрд╢рди (рдХреНрд▓рд╛рдЗрдВрдЯ_рд░реЗрдХ, рдХреНрд▓рд╛рдЗрдВрдЯ_рд░реЗрд╕, рдЕрдЧрд▓рд╛) {
var json = JSON.stringify (client_req.body);
рд╡рд░ рд╡рд┐рдХрд▓реНрдк = createOptions ('рдкреБрдЯ', client_req.baseUrl, json);

var proxy = https.request(options, function (res) {
    client_res.statusCode = res.statusCode;
    res.pipe(client_res, {
        end: true
    });
});

client_req.pipe(proxy, {
    end: true
});

proxy.write(json);
proxy.end();

});

рдлрд╝рдВрдХреНрд╢рди createOptions (рд╡рд┐рдзрд┐, рд▓рдХреНрд╖реНрдп рдпреВрдЖрд░рдПрд▓, рдЬреЗрд╕рди) {
targetUrl = targetUrl.replace ('рдЬрд┐рд░рд╛/', '');
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ("рд╕рд░реНрд╡рд┐рдВрдЧ:" + рдЯрд╛рд░рдЧреЗрдЯрдпреВрдЖрд░рдПрд▓);

const auth = 'Basic ' + new Buffer('usr' + ':' + 'pass').toString('base64');
var headers = {
    'Authorization': auth,
    'Content-Type': 'application/json'
};

return {
    hostname: 'jira.acme.com',
    port: 443,
    path: targetUrl,
    method: method,
    headers: headers
};

}`

@рд╕рд┐рдореЛрд╡

рд╣рд╛рдВ, рдЕрдЧрд░ рдЖрдк рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рджреЛрдмрд╛рд░рд╛ рдЧреМрд░ рдХрд░реЗрдВ:

// рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦреЗрдВ

рдмреЙрдбреА-рдкрд╛рд░реНрд╕рд░ рдЖрдкрдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ред рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреЗрд╡рд▓ bodyParser рдорд┐рдбрд▓рд╡реЗрдпрд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдиреНрдп рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛рдПрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реНрд╡рдЪреНрдЫрддрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдореИрдВ рд╕рднреА рдорд┐рдбрд▓рд╡реЗрдпрд░ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдмрд╕ рдЕрдкрдиреЗ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЧрдпрд╛ рдЬреЛ рдмреЙрдбреАрдкрд╛рд░реНрд╕рд░ рдХреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ proxy рд╕рд╛рде рд╕рднреА рдорд╛рд░реНрдЧреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИ:

pathToRegexp = require('path-to-regexp')
exports.excludeMiddleware = (path, middleware) ->
  (req, res, next) ->
    if pathToRegexp(path).test req.path
      next()
    else
      middleware req, res, next
  app.use(routesService.excludeMiddleware '/proxy/(.*)', bodyParser.json({
    extended: false,
    parameterLimit: 10000,
    limit: 1024 * 1024 * 10
  }))

https://stackoverflow.com/questions/27117337/exclude-route-from-express-middleware

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

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

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

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

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

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

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