2014-01-10 202 views
0

如何使用Node.js http.createServer聽POST請求。如果請求快速完成,所有工作都很好。如果請求完成時間> 5秒,我沒有迴應給客戶端。套接字超時Node.js的

上創建的套接字添加的事件監聽器:

server.on('connection', function(socket) { 
    log.info('SOCKET OPENED' + JSON.stringify(socket.address())); 
    socket.on('end', function() { 
     log.info('SOCKET END: other end of the socket sends a FIN packet'); 
    }); 

    socket.on('timeout', function() { 
     log.info('SOCKET TIMEOUT'); 
    }); 

    socket.on('error', function(error) { 
     log.info('SOCKET ERROR: ' + JSON.stringify(error)); 
    }); 

    socket.on('close', function(had_error) { 
     log.info('SOCKET CLOSED. IT WAS ERROR: ' + had_error); 
    }); 
}); 

上了車請求中的消息(之後開始後約10秒):

info: SOCKET TIMEOUT 
info: SOCKET CLOSED. IT WAS ERROR: false 

但在客戶端套接字沒有得到封閉,所以客戶端等待響應。請求結束成功,響應已發送(關閉套接字!),但客戶端仍在等待。

不知道如何阻止這些超時。從代碼中刪除所有超時。試圖添加KeepAlive,沒有結果。

socket.setKeepAlive(true); 

如何防止socket bultin超時?

回答

2

從節點的setTimeout documentation連接時發生超時不會被切斷。這就是爲什麼瀏覽器仍在等待。你仍然需要結束()或銷燬()套接字。您可以通過在套接字上調用setTimeout來增加超時時間。

socket.setTimeout(1000 * 60 * 300); // 5 hours 
+4

1000 * 60 * 300不是5分鐘,這是5小時 – airato

2

你可以做兩件事情:

socket.setTimeout(/* number of milliseconds */); 

如果你這樣做,那麼服務器可以得到一個超時事件:

server.on('timeout', function(timedOutSocket) { 
    timedOutSocket.write('socket timed out!'); 
    timedOutSocket.end(); 
}); 
+2

爲.setTimeout第一個參數是不是秒數,它是毫秒 – airato

+0

尼斯趕上!謝謝。 – chapinkapa