node-http-proxyでPOSTするとError: socket hang upが起きてた問題

author potpro(ぼとぷろ)
2015/03/25

node-http-proxyでPOSTするとError: socket hang upが起きてた問題

実をいうと、これまで、このブログはPOSTを送るだけで落ちてたようです。えっ

まあブログ見る分ならPOSTすることはないだろうしー・・・ということで今まで放置してました。おい

Error: socket hang up
at createHangUpError (http.js:1476:15)
at Socket.socketCloseListener (http.js:1526:23)
at Socket.emit (events.js:95:17)  
at TCP.close (net.js:465:12)

このまま毎回POSTするたびに落ちるのはちょっとまずいので、やっと修正しました。

元のコード:

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

var apacheProxy = new httpProxy.createProxyServer({
    target: {
    host: 'localhost',
    port: 8080
}});

var nodeProxy = new httpProxy.createProxyServer({
    target: {
    host: 'localhost',
    port: 8081
}});

var server = http.createServer(function ( req, res ) {
    if (req.headers.host == 'potproject.net') {
        nodeProxy.web( req, res );
    } else if (req.headers.host == 'blog.potproject.net') {
        apacheProxy.web( req, res );
    } else {
        res.writeHead(404);
        res.end();
    }

});

server.listen(80);

これに追加したコード。

apacheProxy.on('error', function(err, req, res) {
    res.end();
});
nodeProxy.on('error', function(err, req, res) {
    res.end();
});

ただerrorをキャッチするだけで修正なのか?と思いますが、これで正常に動きます。

元々、bodyParser middlewareを使用してPOSTをオブジェクト化し、req.bodyを受け取らないといけないようなのですが、
bodyParserなんて使っていないためreq.bodyがうまく受け取れずにerrorとして処理される・・・って感じらしいです。

参考:Connect ソースコードリーディング(4) - bodyParser
でも、proxyはPOSTを受け取って処理する必要はないし、問題はないのでこのままです。

一応ちゃんとした解決策として。これを解決したいなら、

  • body-parserモジュールを使用する。
  • Expressなどのbody-parserを行ってくれるフレームワークを使用する。

といった方法があるようです。

参考(というかほぼ同じ問題のstackoverflow):socket hang up error with nodejs