Javascript 将请求发布到节点http proxy Node.js时套接字挂起

Javascript 将请求发布到节点http proxy Node.js时套接字挂起,javascript,node.js,express,solr,proxy,Javascript,Node.js,Express,Solr,Proxy,我在Node.js项目中工作,我希望Node充当solr的代理 代理:我用过。 问题是,代理在get请求的情况下工作得很好,但在post请求的情况下,它会导致套接字挂起异常 下面是我的节点代码示例 var express = require('express'); var router = express.Router(); var http = require('http'); var httpProxy = require('http-proxy') var proxyOptions =

我在Node.js项目中工作,我希望Node充当solr的代理

代理:我用过。 问题是,代理在get请求的情况下工作得很好,但在post请求的情况下,它会导致套接字挂起异常

下面是我的节点代码示例

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
  });
})
这是在节点控制台中运行一段时间后出现的错误

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)

关于问题原因的任何建议

我认为问题来自中间件的顺序。在httpProxy之前使用bodyParser将中断带有JSON body的请求,因此应在bodyParser之前使用httpProxy


您可能想查看有关bodyParser的更多信息。

我在这个问题的帮助下找到了这个问题的解决方案

解决方案是在使用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 }));

使用回调来侦听错误:

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

看,它似乎与使用expression有关添加此回调将防止整个服务器崩溃+1如果我不能在Middleware之前使用它怎么办?我的代理是有条件的,依赖于中间件。。。