Время ожидания POST-запроса node-http-proxy истекло

Я использую node-http-proxy для запроса POST следующим образом:

route.js
---------

var express = require('express');
var httpProxy = require('http-proxy');
var bodyParser = require('body-parser');
var proxy = httpProxy.createProxyServer({secure:false});
var jsonParser = bodyParser.json();

proxy.on('proxyReq', function(proxyReq, req, res, options) {
    logger.debug("proxying for",req.url);
    //set headers
    logger.debug('proxy request forwarded succesfully');
});

proxy.on('error', function (err, req, res) {
  res.writeHead(500, {
    'Content-Type': 'text/plain'
  });
  res.end('Something went wrong. And we are reporting a custom error message.');
});

proxy.on('proxyRes', function (proxyRes, req, res) {
  console.log('RAW Response from the target', JSON.stringify(proxyRes.headers, true, 2));
});

module.exports = function(app){
  app.post('/recording',jsonParser,function(req,res){
    // update request body
    proxy.web(req, res, { target: <<host>>:<<port>>});
  });
}

app.js
---------

var express = require('express');
var app = express();
 require('./routes')(app);

app.listen(8080);
console.log("Demo server running");

Я также использую промежуточное ПО bodyparser, и у него есть известная проблема, упомянутая в Gitbug issue. Поэтому я попытался добавить эту строку в качестве последней строки в app.js.

app.use(require('connect-restreamer')());

Но все же запрос POST зависает и в конечном итоге терпит неудачу. Как это исправить ? Есть ли альтернативы bodyparser?


person KarthikJ    schedule 10.02.2016    source источник
comment
Экземпляр app в app.js такой же, как и в route.js?   -  person Kevin Reilly    schedule 10.02.2016
comment
@KevinReilly Да, это тот же экземпляр. Я передаю его из самого app.js, и я обновил вопросы с фактическим источником.   -  person KarthikJ    schedule 10.02.2016


Ответы (1)


Попробуйте поменять местами промежуточное ПО bodyParser и прокси:

module.exports = function(app){
  app.post('/recording', function(req,res){
    // update request body
    proxy.web(req, res, { target: <<host>>:<<port>>});
  }, jsonParser);
}

Думаю, эта проблема похожа на: ошибка зависания сокета с nodejs.

person chimurai    schedule 13.02.2016
comment
Когда я получаю POST-запрос для /recording, мне нужно проанализировать JSON из тела запроса, а затем проксировать его на другой сервер. Когда я перемещаю промежуточное программное обеспечение после прокси-сервера, я не могу извлечь JSON из исходного запроса, поскольку он говорит, что он не определен. - person KarthikJ; 15.02.2016
comment
В этом случае вам, вероятно, придется использовать github.com/dominictarr/connect-restreamer для восстановить поток; так как bodyParser их портит. - person chimurai; 15.02.2016