【问题标题】:Socket hangup while posting request to Node-http-proxy Node.js向 Node-http-proxy Node.js 发布请求时套接字挂断
【发布时间】:2014-12-25 07:19:23
【问题描述】:

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

对于代理:我使用了Node-http-proxy。 问题是代理在获取请求的情况下工作得很好,但在发布请求的情况下,它会导致套接字挂起异常

这是我的节点代码示例

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)

关于问题原因的任何建议

【问题讨论】:

标签: javascript node.js express solr proxy


【解决方案1】:

我认为问题出在中间件的顺序上。在 httpProxy 之前使用 bodyParser 会破坏带有 JSON 正文的请求,因此应该在 bodyParser 之前使用 httpProxy。

您可能需要查看this 以获取有关 bodyParser 的更多信息。

【讨论】:

  • 中间件之前不能使用怎么办?我的代理是有条件的,并且取决于中间件...
【解决方案2】:

使用回调来监听错误:

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

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

【讨论】:

  • 添加这个回调可以防止整个服务器崩溃+1
【解决方案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 }));

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2014-10-06
    • 1970-01-01
    • 2017-02-18
    • 2013-11-16
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多