在向Node-http-proxy Node.js发送请求时套接字挂断

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

对于代理:我使用了Node-http-proxy 。 问题是代理工作很好的情况下得到请求,但在发送请求的情况下,导致套接字挂起exception

这是我的节点代码的一个例子

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) 

有关问题原因的任何build议

我认为这个问题来自中间件的顺序。 在httpProxy之前使用bodyParser将会破坏JSON体的请求,所以应该在bodyParser之前使用httpProxy。

你可能想要检查这个关于bodyParser的更多信息。

使用callback来收听错误:

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

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

我在这个问题的帮助下find了解决这个问题的方法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 }));