延长Nodejs HTTP 的连接时长

默认情况下,Node.js HTTP 服务器的连接时长为2分钟。若后台处理时间较长,可利用`http.Server`对象的`setTimeout()`方法延长连接时长,避免客户端因超时而断开连接。在Express框架中,可通过设置`server.setTimeout()`来实现全局调整。`response.setTimeout()`则用于单独请求的超时设置,其具体作用和全局超时的区别可能在于对单次请求的控制。

默认情况下,NodeJS HTTP 服务器对每个客户端的Web Request的连接时长是2分钟,也就是说,一旦2分钟内,你服务器端没有发送response,那么客户端的连接就会被关闭(重置?),在现实的应用中,我后台处理数据的时间可能很长,也许3分钟,也许5分钟,客户也愿意等待,那么我完全可以把连接时长设置的多一些。为了解决这个问题,我找了很久,网上大多数说的是怎么缩短timeout的时间,而且很多都是自己调用全局的setTimeout()函数来控制的,说nodeJs没有提供相应的API。直到昨天才发现,原来nodeJs的Http库,有一个setTimeout()的函数,可以解决这个问题,(我本机的,0.6版是没有这个函数的),这篇文章有提及: http://contourline.wordpress.com/2011/03/30/preventing-server-timeout-in-node-js/


说明:

调用nodeJs API, http.createServer()返回的Server对象,有一个setTimeout()方法,可以传入你想要的连接时长,默认是1200000(即2分钟),改成0表示不会timeout。而response对象,也有一个setTimeout()方法,我不知道两者有什么区别,但是我的理解是server.setTimeout()是全局的,response.setTimeout()只针对本次request。


代码:

对于expressJs,相关代码是:

var server = http.createServer(app);
server.setTimeout(0);
server.listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));
});

对于restify,相关代码是:

server.server.setTimeout(0);
server.listen(8080, function () {
    console.log('%s listening at %s', server.name, server.url);
});



### 解决代理请求失败的问题 当遇到 `Proxy error` 和 `ETIMEDOUT` 错误时,这通常意味着前端开发服务器尝试向指定的目标地址发送请求但未能成功建立连接。对于 Vue CLI 项目中的 `devServer.proxy` 配置引发的此类问题,可以考虑以下几个方面来排查并解决问题。 #### 检查目标服务状态 确认目标服务器 (`http://192.168.110.216:8080`) 是否正常运行,并能够响应来自其他客户端的 HTTP 请求[^1]。如果该机器上的应用程序未启动或者防火墙阻止了外部访问,则会触发超时错误。 #### 修改代理设置 在 `vue.config.js` 文件内的 `devServer.proxy` 中增加一些选项可以帮助改善稳定性: ```javascript module.exports = { devServer: { proxy: { '/userLogin': { // 只匹配/userLogin开头路径 target: 'http://192.168.110.216:8080', changeOrigin: true, ws: false, // 如果不需要 WebSocket 支持可设为false secure: false, // 跳过 SSL 证书验证 timeout: 60000, // 设置更长的等待时间(ms),默认可能是较短的时间 onProxyRes(proxyRes, req, res){ console.log('proxy response', proxyRes.statusCode); } } } } }; ``` 上述代码片段通过调整几个参数增强了代理行为,特别是增加了 `timeout` 参数以延长等待远程服务器回应的时间长度,从而减少因短暂网络延迟造成的失败几率[^2]。 #### 排除本地环境干扰因素 有时本地计算机上已有的某些应用可能会占用预期用于开发的服务端口 (如这里的 8080 或者 8081) ,进而影响到正常的代理流程。可以通过命令行工具检查是否有冲突的应用正在使用这些端口号,并采取相应措施释放它们。 #### 测试连通性 确保从执行前端项目的主机可以直接 ping 到目的 IP 地址(`192.168.110.216`) 并且 telnet 命令能顺利打开对应的 TCP 连接(即端口 8080 是开放可达的状态)[^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值