Nodejs etimeout 异常处理
Nodejs etimeout 异常处理
http.get(url, function(res) { }); 当请求的url不存在时程序就会挂掉,说连接超时 该怎么处理
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)异常。为了处理这种情况,可以采用以下方法:
- 捕获异常:使用 try-catch 块捕获异常。
- 设置超时时间:通过设置请求的超时时间来主动处理超时。
- 错误处理回调:为
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')
监听器处理网络请求中的其他错误。
这样,当请求发生超时或其他错误时,程序不会崩溃,而是能够优雅地处理异常。