关于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
12 Nov 21:02:16 - server listening at port 3001......
12 Nov 21:02:22 - Received a request.
12 Nov 21:05:22 - timeout

客户端:

bash-3.2$ node app.js
12 Nov 21:02:22 - start request...
12 Nov 21:04:22 - { [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
12 Nov 21:37:22 - server listening at port 3001......
12 Nov 21:37:29 - Received a request.
12 Nov 21:40:29 - timeout

客户端:

bash-3.2$ node app.js
12 Nov 21:37:29 - start request...
12 Nov 21:40:29 - STATUS: 200
12 Nov 21:40:29 - hello world 

从上面运行结果可见,客户端能够正常接收到服务器端的返回结果了。

(done)

时间: 2024-10-21 17:03:31

关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施的相关文章

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

1.声明报错的方法,以及相对应的页面 //把数据库的调用方法配置到请求中 server.use((req, res, next) => { //把数据库存入req中 req.db = db; //把报错方法存入res中 res.showError = code => { switch (code) { case 404: res.status(code).render('404', {}); break; case 500: res.status(code).render('500', {})

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

2014-08-23 今天开始学习Node.js,在写一个文件上传的功能时候,调用fs.renameSync方法错误 出错代码所在如下: 1 function upload(response,request){ 2 console.log("upload called"); 3 var form = new formidable.IncomingForm(); 4 console.log("about to parse"); 5 form.parse(request

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

添加时间戳给callbackId $.ajax({ type: "get", url: url, timeout: 6000, data: param, cache: false, dataType: "jsonp", jsonpCallback: "jsoncallback" + new Date().getTime(), success: function(data) { if (data != null) { fun(data); } },

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

<?php /* 最近做一个ajax validate表单验证提交的代码,在ajax提交的时候 JS请求报错:Unexpected token T in JSON at position 0 描述: 这是一个请求,参数的地方报这要的错,请问是为什么? 百思不得其解啊 解决方案1: 去看下json的格式要求,JSON.parse()方法对json串要求很严格 解决方案2: http://www.bejson.com/ 用这个网址测试试试json格式是不是有误,换行,单引号什么的会导致报错,格式要求

firefox同步ajax请求报错的问题 A parameter or an operation is not supported by the underlying object

今天在测试系统时,一个很正常的功能在firefox下报错,经过验证在ie和chrome浏览器中功能这个正常.   调试后发现: 请求比其他请求的特殊点在于同步请求.   经过firefox的控制台上测试发现错误日志:   "[Exception... "A parameter or an operation is not supported by the underlying object" code: "15" nsresult: "0x805

JS function document.onclick(){}报错Syntax error on token &quot;function&quot;, delete this token

JS function document.onclick(){}报错Syntax error on token "function", delete this token function document.onclick() //任意点击时关闭该控件 //ie6的情况可以由下面的切换焦点处理代替 {    with(window.event)   { if (srcElement != outObject && srcElement != outButton)    

Node.js GET/POST请求

在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器一般都使用GET/POST请求. 本章节我们将为大家介绍 Node.js GET/POST请求. 获取GET请求内容 由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数. node.js中url模块中的parse函数提供了这个功能. var http = require('http'); var url = require('url');

body-parser Node.js(Express) HTTP请求体解析中间件

body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日     781     声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包含请求体,Node.js 原生HTTP模块中,请求体要基于流的方式接收和解析.body-parser是一个HTTP请求体解析中间件,使用这个模块可以解析JSON.Raw.文本.URL-encoded格式的请求体,Express框架中就是使用这个模块做为请求体解析中间件. 请求体解析 1.1 原生环境

nuget包管理nuget服务器发布包时出现请求报错 406 (Not Acceptable)

在window服务器上部署nuget服务器时,发布包时出现请求报错 406 (Not Acceptable) 验证用户名.密码正确的情况下,还是出现上面错误.后面跟踪服务器日志,发现window\temp文件超过65535,删除过期临时文件后即可 原文地址:https://www.cnblogs.com/94cool/p/10749129.html