You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中HTTP长连接(Keep-Alive)保持问题及实现咨询

How to Maintain Persistent HTTP Connections in Your Node.js/Express Server

First, let’s break down why your current setup is closing connections unexpectedly. The biggest red flag here is the incorrect Content-Length header you’re setting manually. When you send the JSON response {"status": 1, "message": "Registration Successful"}, the actual length of this payload is longer than mess.length (which only accounts for the string "Registration Successful"). This mismatch confuses the client-server communication flow and can trigger premature connection termination.

Step 1: Fix the Response Headers

Express automatically handles setting the correct Content-Type and Content-Length headers when you use res.send() with a JSON object. Ditch the manual header configuration to let Express do its job properly. Here’s your corrected route handler:

app.post('/api/device/register', function(req, res) {
  const mess = "Registration Successful";
  res.status(200).send({ 
    "status": 1, 
    "message": mess 
  });
});

Step 2: Configure Server Keep-Alive Timeouts

By default, Node.js’s HTTP server has a keepAliveTimeout of 5000ms (5 seconds) — meaning after 5 seconds of idle time on a keep-alive connection, the server sends a FIN packet to close it. If you want to extend this window for longer-lived connections, adjust these settings when creating your server:

var express = require('express');
var app = express();
var http = require('http');

// Create server with custom keep-alive settings
var server = http.createServer(app);
// Extend idle connection timeout to 30 seconds (tweak this as needed)
server.keepAliveTimeout = 30000;
// Ensure headers timeout is slightly longer to avoid race conditions
server.headersTimeout = 31000;

server.listen(8080, function(){ 
  console.log('Server listening on port 8080'); 
});

// Your corrected registration route
app.post('/api/device/register', function(req, res) {
  const mess = "Registration Successful";
  res.status(200).send({ 
    "status": 1, 
    "message": mess 
  });
});

Quick Explanation of Settings:

  • keepAliveTimeout: How long (in ms) the server waits for new requests on an idle keep-alive connection before closing it.
  • headersTimeout: Must be set to a value greater than keepAliveTimeout to prevent the server from closing the connection mid-request while the client is still sending headers.

Step 3: Verify the Fix

After updating your code, test with Postman again:

  • Send multiple requests in quick succession — Postman should reuse the same keep-alive connection by default.
  • Check the response headers to confirm Connection: keep-alive is still present.
  • Monitor the TCP connection: it should now stay open until either the client closes it or your extended timeout is reached.

Why This Works:

  • Fixing the Content-Length header ensures the client receives the full response without confusion, eliminating one cause of premature termination.
  • Adjusting the server’s keep-alive timeouts lets idle connections persist longer, enabling multiple requests to be sent over the same TCP connection as you need.

内容的提问来源于stack exchange,提问作者chandan kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:33:28