Подтвердить что ты не робот

Express req.pipe() не работает

  • Я хочу слушать входящий запрос POST в экспресс.
  • Я хочу передать этот запрос другому серверу
  • Я хочу получить ответ внутри экспресс-обработчика (я не хочу отвечать на ответ на поток выражений res)

Теперь у меня есть следующий код:

app.post('server1',function(req,res,next){
    var request = require('request');
    req.pipe(request.post('server2')).pipe(res);

}

Так что это не сработает - запрос даже не передан на сервер2 - я проверил его и нет входящего запроса.


Я решил точки 1 и 2 следующим образом:

var bodyParser = express.bodyParser();

app.use(function(req,res,next){

    if(req.path == '/server1' && req.method == 'POST') {
        return next();
    }
    else {
        bodyParser(req,res,next);
    }
});

Не очень приятно, но он работает - он просто отключает bodyparser для одного маршрута (POST/server1).

Но я до сих пор не знаю, как получить тело ответа json из запрошенного запроса - у меня есть следующий код:

app.post('/server1',function(req,res,next){

    var request = require('request');
    var pipe = req.pipe(request.post('/server2'));

    pipe.on('end',function(){

        var res2 = pipe.response;
        console.log(res2);

    });
});

res2 объект имеет правильный statusCode и заголовки и так далее, но он не содержит тело - как я могу получить это из объекта res2? /server2 возвращает некоторые данные в json, но я не знаю, как читать его из ответа...

4b9b3361

Ответ 1

Это не работает, потому что bodyParser перехватывает все тела с помощью парсеров

Ответ 2

Я думаю, ты почти там. Вы должны слушать события data на трубке, чтобы получить ответ:

app.post('/server1',function(req,res,next) {
  var request   = require('request');
  var pipe      = req.pipe(request.post('/server2'));
  var response  = [];

  pipe.on('data',function(chunk) { 
    response.push(chunk);
  });

  pipe.on('end',function() { 
    var res2 = Buffer.concat(response);
    console.log(res2);
    // don't forget to end the 'res' response after this!
    ...
  });
});

Однако, поскольку вы решили проблему "bodyParser() на пути", вы также можете использовать свою начальную настройку канала, если хотите просто вернуть ответ, сгенерированный сервером2 (также обязательно используйте правильный URL-адрес при использовании request).