Node.js教程 Node.js的httpClieint请求报错ECONNRESET解析
沉沙 2018-07-25 来源 : 阅读 1091 评论 0

摘要:本篇Node.js教程探讨了Node.js的httpClieint请求报错ECONNRESET,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。

本篇Node.js教程探讨了Node.js的httpClieint请求报错ECONNRESET,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。

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

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


本文由职坐标整理并发布,了解更多内容,请关注职坐标WEB前端Node.js频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程