博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施
阅读量:6225 次
发布时间:2019-06-21

本文共 3356 字,大约阅读时间需要 11 分钟。

背景说明

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

使用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)

转载地址:http://kwyna.baihongyu.com/

你可能感兴趣的文章
Eclipse崩溃后无法启动的问题解决
查看>>
Android Studio git ignore
查看>>
springmvc
查看>>
22.2. 用户认证
查看>>
1.7. User interfaces
查看>>
阿里Druid数据连接池在SSM框架中的配置使用
查看>>
基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作...
查看>>
Linux虚拟主机通过程序实现二级域名绑定到子目录
查看>>
7.12. cvs diff
查看>>
Android酷炫实用的开源框架(UI框架)
查看>>
Winform开发框架之对话框样式同化
查看>>
一脸懵逼学习Linux的Shell编程
查看>>
Jmeter调试工具---Debug Sampler
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]4.5.14
查看>>
impdp的TABLE_EXISTS_ACTION参数选项
查看>>
机器学习之深入理解神经网络理论基础、BP算法及其Python实现
查看>>
ecshop设置一个子类对应多个父类并指定跳转url的修改方法
查看>>
【spring源码学习】spring的事务管理的源码解析
查看>>
遇见喜欢数学的女孩
查看>>
linux进程资源占用高原因分析命令记录
查看>>