背景说明

最近在工作项目中有下面一个场景:

使用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的原因和解决措施的更多相关文章

  1. Node.js连接MySQL数据库报错

    解决Node.js第一次连接MySQL数据库时出现[SELECT ERROR] - ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authen ...

  2. node.js 框架express关于报错页面的配置

    1.声明报错的方法,以及相对应的页面 //把数据库的调用方法配置到请求中 server.use((req, res, next) => { //把数据库存入req中 req.db = db; / ...

  3. 下载 node.js 步骤 bower npm 报错解决

    1,下载node.js  ,安装之后就可以 了 2,解决"npm不是内部或外部命令"   ,打开安装的node.js  的文件夹 将这个地址,放在环境变量里面 <1,属性环境 ...

  4. 解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)

    2014-08-23 今天开始学习Node.js,在写一个文件上传的功能时候,调用fs.renameSync方法错误 出错代码所在如下: function upload(response,reques ...

  5. jsonp多次请求报错 not a function的解决方法

    添加时间戳给callbackId $.ajax({ type: "get", url: url, timeout: 6000, data: param, cache: false, ...

  6. webservice使用windows身份验证,ajax请求报错401未授权的解决办法

    $.ajax({ type: "GET", url: service_url, dataType: "xml", data: "ParamId=&qu ...

  7. python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]

    python爬虫,使用requests库发送https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法: imp ...

  8. JS请求报错:Unexpected token T in JSON at position 0

    <?php /* 最近做一个ajax validate表单验证提交的代码,在ajax提交的时候 JS请求报错:Unexpected token T in JSON at position 0 描 ...

  9. 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 ...

随机推荐

  1. Maven详细介绍

    Maven 目录 1 什么是Maven? 2 Maven 的好处 3 获取和安装 3.1 获取 3.2 安装 3.2.1 环境变量的配置 4 设置本地仓库 5 创建简单的Maven实例 5.1 使用骨 ...

  2. 编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,统计鱼的数量 co

    package com.hanqi.test; public class Animal { private String name; private int legs; private int cou ...

  3. coursera机器学习-支持向量机SVM

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  4. MFC MDI 获取当前视图

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  5. 【mysql】关于硬件方面的一些优化

    一.CPU最大性能模式 cpu利用特点 5.1 最高可用4个核 5.5 最高可用24核 5.6 最高可用64核心 一次query对应一个逻辑CPU 你仔细检查的话,有些服务器上会有的一个有趣的现象:你 ...

  6. df,du,mount

    df 查看当前系统中文件系统的使用情况 $df [-aTh]缺省选项查看当前系统的所有文件系统 -a列出所有的信息 -T列出文件系统类型 -hhuman-readable,用合适的单位表示大小 $df ...

  7. x01.os.12: 在 windows 中写 OS

    在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可 ...

  8. linux-3.14.13 看到mpls gso支持

    在net/Kconfig source "net/mpls/Kconfig"

  9. ELF Format 笔记(七)—— 符号表

    最是那一低头的温柔,像一朵水莲花不胜凉风的娇羞,道一声珍重,道一声珍重,那一声珍重里有蜜甜的忧愁 —— 徐志摩 ilocker:关注 Android 安全(新手) QQ: 2597294287 符号表 ...

  10. 浅谈C++设计模式之单例模式

    单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止客户实例化多个对象,一个最好的办法就是让类自身负责保护它的唯一实例,这个类可 ...