potpro (ぽとぷろ)
Full-stuck engineer(Not Full-stack)
JS/PHP/Go/Docker/Nginxなど。技術または趣味寄りの発信ブログです。
全 85 記事 最新記事
node-http-proxyでPOSTするとError: socket hang upが起きてた問題
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