Разбивка сокета при отправке запроса на Node -http-proxy Node.js

Я работаю в проекте Node.js и хочу, чтобы node выступал в качестве прокси для solr

Для прокси: я использовал Node-http-proxy. проблема в том, что прокси-сервер отлично работает в случае получения запросов, но в случае почтовых запросов он вызывает исключение сокета.

Вот пример моего кода node

var express = require('express');
var router = express.Router();

var http = require('http');
var httpProxy = require('http-proxy')

var proxyOptions = {
  host: "127.0.0.1",
  port: 8983
};
var proxy = httpProxy.createProxyServer(proxyOptions);

// It works excellent in GET request
router.get('/solr/*', function(req, res) {
  proxy.web(req, res, {
    target: 'http://' + proxyOptions.host + ':' + proxyOptions.port
  });
})

// the socket hang up in post request
router.post('/solr/*', function(req, res) {
  console.log('Post Request');
  proxy.web(req, res, {
    target: 'http://' + proxyOptions.host + ':' + proxyOptions.port
  });
})

И это ошибка через некоторое время в консоли node

Error: socket hang up
    at createHangUpError (http.js:1476:15)
    at Socket.socketOnEnd [as onend] (http.js:1572:23)
    at Socket.g (events.js:180:16)
    at Socket.emit (events.js:117:20)
    at _stream_readable.js:943:16
    at process._tickCallback (node.js:419:13)

Любые предложения о причине проблемы

Ответ 1

Я думаю, что проблема исходит из порядка промежуточного программного обеспечения. Использование bodyParser до того, как httpProxy разорвет запросы с телом JSON, так что httpProxy следует использовать перед bodyParser.

Вы можете проверить этот для получения дополнительной информации о bodyParser.

Ответ 2

Используйте обратный вызов для прослушивания ошибки:

proxy.web(req, res, { target: 'http://mytarget.com:8080' }, function(e) { ... });

из https://github.com/nodejitsu/node-http-proxy

Ответ 3

Я нашел решение этой проблемы с помощью этой проблемы https://github.com/nodejitsu/node-http-proxy/issues/180#issuecomment-12244852

решение заключается в использовании промежуточного программного обеспечения для прокси-сервера перед использованием bodyparser

пример кода

 // use middleware first 
app.post('/solr/*',function(req, res) {
  console.log('POST REQUEST')
  //res.end();
   proxy.web(req, res, {
     target: 'http://' + proxyOptions.host + ':' + proxyOptions.port
   });
})
app.use(logger('dev'));
// use bodyparser after that
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));