2014-10-29 38 views
15

我在Node.js的項目工作,我希望節點作爲代理行事的Solr插座掛斷,同時發佈請求節點-HTTP代理的Node.js

對於代理:我用Node-http-proxy。 問題是,代理工作具有優良的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) 

這個問題的原因有什麼建議

+1

https://github.com/nodejitsu/node-http-proxy/issues/180#issuecomment-12244852被用來做什麼用快遞 – alandarev 2014-10-29 14:38:36

回答

13

我認爲這個問題來自於或中間件。在httpProxy之前使用bodyParser將使用JSON主體來破壞請求,所以應該在bodyParser之前使用httpProxy。

您可能想檢查this瞭解更多關於bodyParser的信息。

+4

如果我不能中間件之前使用它呢?我的代理是有條件的並取決於中間件... – oleynikd 2016-04-10 17:12:22

5

我找到了解決這個問題,這個問題 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 }));