关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施
背景说明
最近在工作项目中有下面一个场景:
使用Node.js的express框架实现了一个文件系统服务器端,其中有个API用于客户端上传文件。客户端使用Node.js的HttpClient来调用服务器端的API上传文件。
客户端在上传小文件时没有任何问题,在上传大文件时httpClient请求报错了下面的错误,
{ [Error: socket hang up] code: 'ECONNRESET' }
google了很多资料,最后看了一下Node.js的相关源码终于知道了该问题的原因和解决办法。
问题原因
出现该问题的原因是:Node.js提供的HttpServer默认设置了超时时间为2分钟,当一个请求的处理时间超过2分钟,HttpServer会自动将该请求的socket关闭掉,于是客户端便收到了 ECONNRESET 的错误信息了。可以参考Node.js的源码。
下面我们使用了一个例子来验证一下。
服务器端:
服务器端使用express框架,注册了一个路径为““ 的 GET 方法路由处理函数。在该路由处理函数中,通过setTimeout方式设置了超时处理,3分钟后超时才会对请求进行相应。
const express = require('express');
const util = require('util');
const app = express(); app.get("/", function(req, res, next) {
util.log("Received a request."); setTimeout(function() {
res.setHeader('transfer-encoding', 'chunked');
res.status(200);
util.log("timeout")
res.write("hello world");
res.end();
}, 3 * 60 * 1000)
});
var server = app.listen(3001, function() {
sutil.log("server listening at port 3001......");
});
客户端:
客户端通过调用http.request方法请求服务器端的接口,并打印返回的信息。
const http = require('http');
const util = require('util') var opt = {
host: 'localhost',
port: 3001,
method: 'GET',
};
var req = http.request(opt, function(res) {
util.log('STATUS:', res.statusCode);
res.setEncoding('utf8');
var resultText = '';
res.on('data', (chunk) => {
resultText += chunk;
});
res.on('end', () => {
util.log(resultText);
});
}); req.on('error', (e) => {
util.log(e);
}); util.log("start request...")
req.end();
先启动服务器端,然后启动客户端。请求的结果如下所示:
服务器端:
bbash-3.2$ node app.js
Nov :: - server listening at port ......
Nov :: - Received a request.
Nov :: - timeout
客户端:
bash-3.2$ node app.js
Nov :: - start request...
Nov :: - { [Error: socket hang up] code: 'ECONNRESET' }
通过上面的运行结果可以看到,客户端在请求等待了2分钟之后,就报错了 ECONNRESET 的错误。
解决措施
解决措施:调用服务器端的server.setTimeout()方法将服务器端的超时设置得大一点或者直接将超时机制关闭(将超时时间设置为0即可关闭)。
就使用上面的代码,客户端不变,服务器在文件最后调用server.setTimeout()方法,如下所示,
var server = app.listen(3001, function() {
sutil.log("server listening at port 3001......");
});
server.setTimeout(0)
先启动服务器端,然后再启动客户端,运行结果如下:
服务器端:
bash-3.2$ node app.js
Nov :: - server listening at port ......
Nov :: - Received a request.
Nov :: - timeout
客户端:
bash-3.2$ node app.js
Nov :: - start request...
Nov :: - STATUS:
Nov :: - hello world
从上面运行结果可见,客户端能够正常接收到服务器端的返回结果了。
(done)
关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施的更多相关文章
- Node.js连接MySQL数据库报错
解决Node.js第一次连接MySQL数据库时出现[SELECT ERROR] - ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authen ...
- node.js 框架express关于报错页面的配置
1.声明报错的方法,以及相对应的页面 //把数据库的调用方法配置到请求中 server.use((req, res, next) => { //把数据库存入req中 req.db = db; / ...
- 下载 node.js 步骤 bower npm 报错解决
1,下载node.js ,安装之后就可以 了 2,解决"npm不是内部或外部命令" ,打开安装的node.js 的文件夹 将这个地址,放在环境变量里面 <1,属性环境 ...
- 解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)
2014-08-23 今天开始学习Node.js,在写一个文件上传的功能时候,调用fs.renameSync方法错误 出错代码所在如下: function upload(response,reques ...
- jsonp多次请求报错 not a function的解决方法
添加时间戳给callbackId $.ajax({ type: "get", url: url, timeout: 6000, data: param, cache: false, ...
- webservice使用windows身份验证,ajax请求报错401未授权的解决办法
$.ajax({ type: "GET", url: service_url, dataType: "xml", data: "ParamId=&qu ...
- python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
python爬虫,使用requests库发送https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法: imp ...
- JS请求报错:Unexpected token T in JSON at position 0
<?php /* 最近做一个ajax validate表单验证提交的代码,在ajax提交的时候 JS请求报错:Unexpected token T in JSON at position 0 描 ...
- JS function document.onclick(){}报错Syntax error on token "function", delete this token
JS function document.onclick(){}报错Syntax error on token "function", delete this token func ...
随机推荐
- jquery checkbox操作
一.通过选择器选取CheckBox: 1.给CheckBox设置一个id属性,通过id选择器选取: <input type="checkbox" name="myB ...
- 今天简单说一下cdc 的使用
从08开始,sql server 提供了一种叫做 变更数据捕获 cdc(Change Data Capture) 的功能,可以通过启用这个功能,来实现查看数据库中的表对象的数据的变化情况.(我感觉就是 ...
- Storm系列(三):创建Maven项目打包提交wordcount到Storm集群
在上一篇博客中,我们通过Storm.Net.Adapter创建了一个使用Csharp编写的Storm Topology - wordcount.本文将介绍如何编写Java端的程序以及如何发布到测试的S ...
- 浴室随想——RogueLike随想
好玩的RogueLike 0 不同的追求 1 从追求中寻找商机 2 更的直接方法 3 我的追求 4 我的方法 5 好玩的RogueLike RogueLike游戏很好玩,因为你永远不知道接下来会发生什 ...
- Tomcat源码分析之—具体启动流程分析
从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...
- iOS基于MBProgressHUD的二次封装,一行搞定,使用超简单
MBProgressHUD的使用,临时总结了几款最常用的使用场景: 1.提示消息 用法: [YJProgressHUD showMessage:@"显示文字,1s隐藏" inVie ...
- CentOS 7.2安装Zabbix 3.2全攻略
放在最前面:鉴于网上爬虫猖獗,博客被盗时有发生,这里需要来个链接,大家请认准来自博客园的Scoter:http://www.cnblogs.com/scoter2008 1.安装环境:VMware虚拟 ...
- 一:Go编程语言规范--块、声明、作用域
1.块 块为一对大括号括住的声明和语句.块 = "{" { 语句 ";" } "}" . 除显式源码块外,还有隐式块: 全域块 包含所有的G ...
- java报表工具FineReport使用中遇到的常见报错及解决办法(三)
这里写点抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己. 出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有.有报错要看日志.下面简单罗列下常见的问题,大多 ...
- Andorid 6连接Libreswan L2TP VPN
手机升级到Android 6以后,以前正常使用的L2TP VPN却无法连接了.服务器端日志: "vpnpsk"[119] 114.249.245.192 #240: no acce ...