Nodejs etimeout 异常处理

Nodejs etimeout 异常处理

http.get(url, function(res) { }); 当请求的url不存在时程序就会挂掉,说连接超时 该怎么处理

5 回复

http.get(url, function(res) { }); 当请求的url不存在时程序就会挂掉,说连接超时 该怎么处理


设置error 回调函数

Node.js etimeout 异常处理

在使用Node.js进行网络请求时,经常会遇到各种异常情况,比如连接超时。本文将介绍如何处理这些异常,特别是在使用http.get方法时。

示例代码

首先,我们来看一个基本的http.get请求示例:

const http = require('http');

const url = 'http://example.com/nonexistent'; // 这个URL是不存在的

http.get(url, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
        console.log('No more data in response.');
    });
}).on('error', (err) => {
    console.error(`Problem with request: ${err.message}`);
});

在这个例子中,如果url不存在或服务器无法响应,程序会抛出错误并退出。为了更好地处理这种情况,我们可以添加对timeout事件的监听,并设置适当的超时时间。

处理超时异常

你可以通过设置socketTimeout来指定超时时间。一旦超过这个时间,将会触发timeout事件。我们可以在回调函数中处理这个事件,并进行适当的异常处理。

const http = require('http');
const url = 'http://example.com/nonexistent';

const req = http.get(url, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
        console.log('No more data in response.');
    });
});

// 设置超时时间为10秒(10000毫秒)
req.setTimeout(10000, () => {
    console.error('Request timed out');
    req.abort(); // 取消请求
});

req.on('error', (err) => {
    console.error(`Problem with request: ${err.message}`);
});

解释

  • req.setTimeout: 设置请求的超时时间。当请求在指定时间内没有完成时,将会触发timeout事件。
  • req.abort(): 在超时发生时,调用abort方法取消当前的HTTP请求。
  • req.on('error', ...): 监听请求错误事件,捕获任何可能发生的错误。

通过上述方法,你可以有效地处理http.get请求中的超时问题,确保程序不会因为网络请求失败而意外终止。

这个异常用try,catch 是catch不住的,要用on(‘error’) 来处理

在 Node.js 中使用 http.get 进行 HTTP 请求时,如果目标 URL 不存在或服务器无响应,可能会触发连接超时(ECONNRESET 或 ETIMEOUT)异常。为了处理这种情况,可以采用以下方法:

  1. 捕获异常:使用 try-catch 块捕获异常。
  2. 设置超时时间:通过设置请求的超时时间来主动处理超时。
  3. 错误处理回调:为 http.get 提供错误处理回调函数。

下面是一个示例代码,展示了如何进行这些处理:

const http = require('http');

function fetchUrl(url) {
    return new Promise((resolve, reject) => {
        const req = http.get(url, (res) => {
            let data = '';

            res.on('data', (chunk) => {
                data += chunk;
            });

            res.on('end', () => {
                resolve(data);
            });
        });

        // 设置超时时间,例如 5 秒
        req.setTimeout(5000);

        req.on('timeout', () => {
            req.destroy();
            reject(new Error('请求超时'));
        });

        req.on('error', (err) => {
            reject(err);
        });
    });
}

// 使用 async/await 处理异步操作
async function fetchData() {
    try {
        const url = 'http://example.com'; // 示例 URL
        const result = await fetchUrl(url);
        console.log(result);
    } catch (err) {
        console.error(`请求失败: ${err.message}`);
    }
}

fetchData();

解释:

  • try-catch: 使用 try-catch 块捕获并处理可能发生的异常。
  • Promise: 将 http.get 转换为 Promise,以便使用 async/await 更方便地处理异步操作。
  • req.setTimeout: 设置请求的超时时间为 5 秒。如果超过这个时间,请求会被取消,并触发 'timeout' 事件。
  • req.destroy: 在超时时销毁请求对象。
  • 错误处理: 通过 .on('error') 监听器处理网络请求中的其他错误。

这样,当请求发生超时或其他错误时,程序不会崩溃,而是能够优雅地处理异常。

回到顶部