`
白黑山河
  • 浏览: 47314 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

nodejs, http.request超时控制

阅读更多

场景: 使用nodejs请求外部网页,要求规定时间内返回

依赖库: http/https

方案:
由于nodejs自身没有对http连接的可配置的超时控制机制,需要自行增加

/**
 * if timeout, emit "timeout" event, abort request, and emit "abort" event for response
 * @param options
 * @param timeout
 * @param callback
 */
function httpGetWithTimeoutSupport(options, timeout, callback) {
    var timeoutEvent;

    var req = http.get(options, function(res) {
        res.on("end", function() {
            clearTimeout(timeoutEvent);
            console.log("end");
        })
        res.on("close", function(e) {
            clearTimeout(timeoutEvent);
            console.log("close");
        })

        res.on("abort", function() {
            console.log("abort");
        });

        callback(res);
    });

    req.on("timeout", function() {
        console.log("timeout received");
        if (req.res) {
            req.res.emit("abort");
        }

        req.abort();
    });

    timeoutEvent = setTimeout(function() {
        req.emit("timeout");
    }, timeout);

    return req;
}

httpGetWithTimeoutSupport(url.parse("http://www.google.com"), 1000, function(res){
     var data = "";
    res.on("data", function(d) {
        data += d;
    });
    res.on("end", function() {
        console.log(data);
    })
});

nodejs自带一个默认的2分钟的强制超时, 见http.js;这个超时会导致close事件发生,错误代码为"timeout". 同时超时是针对连接而非单个的请求的(一个连接上有许多请求).

分享到:
评论
2 楼 白黑山河 2011-07-05  
console.log的确出现了两次,不过这个日志输出不是重点,只是表示可以在这里注册一个事件。
事件的注册可以重复的,上面一个事件注册是为了消除超时事件,下面一个事件注册是用于具体的逻辑。
blog里毕竟不能把具体的业务直接放出来,console.log是一种取巧的替代方式
1 楼 windyrobin 2011-07-05  
怎么两个
res.on("end", function() {
        console.log(data);
    })

重复料把

相关推荐

    通过NodeJS中的http.get() 和 http.request()模块两种方法,调用中国天气api

    在NodeJS中,HTTP模块是...在实际项目中,你可能还需要考虑错误重试、超时控制以及使用Promise或async/await来管理异步流程。同时,不要忘记替换示例中的`YOUR_API_KEY`为真实的API密钥,以确保能成功调用中国天气API。

    nodejs urllib 库

    - **证书验证**:可以通过配置 `rejectUnauthorized` 来控制是否拒绝非可信的证书。 - **GZIP/DEFLATE 解压**:`urllib` 默认支持 GZIP 和 DEFLATE 压缩格式的解压。 - **URL 解析和构建**:库内集成了 URL 解析...

    短信验证码注册登录NodeJs - Axios.js、Native.js、Request.js、Unirest.js文件.zip

    使用Request.js,开发者可以轻松地设置请求头、超时、代理等参数,非常适合用于集成短信服务提供商的API,以发送和接收验证码。 4. **Unirest.js** Unirest是Mashape公司开发的一套多语言的HTTP客户端库,Unirest....

    nodejs发送http请求时遇到404长时间未响应的解决方法.docx

    Node.js 发送 HTTP 请求时遇到 404 长时间未响应的解决方法 Node.js 是一个基于 JavaScript 的服务器端 runtime 环境,它可以用于构建高性能的 Web 服务器。然而,在使用 Node.js 发送 HTTP 请求时,可能会遇到 ...

    node.js超时timeout详解

    console.log('响应超时.'); // 如果不提供回调函数,超时后会关闭socket连接 // 这里提供了一个示例,实际上不需要显示地调用res.end() }); setTimeout(function() { // 设置响应头 res.setHeader('Content-...

    nodejs-request:这是一个关于 nodejs 请求的示例代码

    在标题中提到的 "nodejs-request" 示例代码,很可能是展示如何使用 `request` 模块来发送 HTTP 请求。这个模块提供了丰富的功能,包括 GET、POST、PUT、DELETE 等 HTTP 方法,以及支持自定义头、数据编码、重定向...

    node-request-interceptor:节点的低级HTTPHTTPSXHR请求拦截库

    尽管有许多网络通信模拟库,但它们倾向于将请求拦截用作实现细节,从而向您展示了一个高级API,其中包括请求匹配,超时,重试等。 这个库是一个条带到骨的实现,它提供了尽可能少的抽象以对NodeJS中的任何请求执

    nodejs的http请求html/css/js

    虽然Node.js内置的http模块可以满足基本需求,但实际开发中,更常见的是使用axios或request等成熟的HTTP客户端库。这些库提供了更丰富的功能,如自动处理重定向、超时、请求和响应的编码、支持HTTPS等。 例如,使用...

    Nodejs抓取html页面内容(推荐)

    这两种方法都可以有效地抓取HTML页面内容,但根据实际需求,你可能需要扩展这些基础代码,例如添加错误处理、超时控制、请求重试机制,或者使用更高级的库,如`axios`或`request-promise`,以提高代码的可读性和可...

    Node.js-通过nodejs获取服务器中的html文件

    在实际应用中,确保正确处理各种可能出现的错误是非常重要的,比如网络问题、请求超时、服务器返回错误等。 总结,通过Node.js获取服务器上的HTML文件,需要理解HTTP/HTTPS请求、响应处理以及可能用到的第三方库。...

    NodeJS学习笔记之Http模块

    另外,我们还可以通过设置`server.maxHeadersCount`来限制请求头的数量,或者通过`server.setTimeout()`和`server.timeout`来处理服务器的超时行为。 当编写响应逻辑时,我们通常使用`http.ServerResponse`类的实例...

    nodejs爬虫爬取小说

    10. **错误处理与日志记录**: 爬虫运行过程中可能出现各种错误,如网络异常、请求超时等,因此需要编写合适的错误处理逻辑,并记录日志,便于问题排查。 以上就是使用Node.js爬虫爬取小说涉及的一些核心知识点。...

    nodejs调用快递查询接口源码

    在`index.js`中,你会看到如何使用HTTP请求库(如axios或request)来发送GET或POST请求到快递查询接口。请求中通常会包含快递单号和快递公司代码,接口返回的JSON数据包含了快递包裹的最新跟踪信息。 4. **封装...

    GoRequest-简化的HTTP客户端(受nodejs SuperAgent的启发)-Golang开发

    GoRequest GoRequest –简化的HTTP客户端(受Node.js中著名的SuperAgent lib的启发)“像机枪一样射击请求”-Gopher发送请求从未像现在这样有趣或容易。 它带有GoRequest GoRequest-简化的HTTP客户端(受Node.js中...

    Nodejs Post请求报socket hang up错误的解决办法

    从文件中提供的代码段可以看到,开发者使用http模块的request方法创建了一个请求对象req,这个对象配置了多个选项,包括目标服务器的hostname、端口号port、访问路径path、请求方法method以及刚才提到的headers。...

    nodejs-requests:Node.js 请求具有多个库的示例

    在`nodejs-requests-master`这个压缩包中,很可能包含了不同HTTP库的示例代码,帮助学习者理解如何在Node.js中使用这些库。通过阅读和实践这些示例,你可以更好地掌握这些库的用法,从而在自己的项目中灵活地进行...

    详解nodejs http请求相关总结

    在Node.js中,发起HTTP请求主要使用http模块提供的get()和request()方法。这两个方法的使用场景略有不同,get()方法是对request()的封装,用于发起GET请求,使用起来更为简便。而request()方法则提供更多的灵活性,...

    Alligator:NodeJS(AntiNode)之上JavaScript应用服务器

    分布式会话管理,包括超时 分布式应用程序范围管理 动态js加载器(lib文件夹) 用户可以设置服务器端脚本的开始和结束标签 每个CPU使用所有内核( nodes设置参数) 当一个人写一个嵌套在标签上的脚本时 他/她可以...

    nodejs批量下载图片的实现方法

    bagpipe允许我们设定并发数和超时时间,从而更精确地控制下载过程,避免单个下载操作过慢影响整体效率。通过设定合适的并发数,可以平衡网络带宽和磁盘IO,从而达到最优的下载速度。 Node.js在批量下载图片时需要...

Global site tag (gtag.js) - Google Analytics