如何让Node.js应用遇请求错误时保持持续运行?
解决Node.js请求遇ECONNRESET等错误崩溃的问题
你的核心问题有两个:一是try catch无法捕获异步回调里的错误,二是错误发生时response为undefined,仍强行访问statusCode导致未捕获的TypeError,最终让程序崩溃。以下是具体解决方案:
一、修复回调版代码(基于原request库)
直接在回调内部处理错误,避免访问undefined的response:
const request = require('request') const url = 'url.net'; let i = 0; // 用let替代全局var,避免变量污染 function sender() { request(url, (error, response, body) => { // 优先处理错误,有错误时直接返回,不执行后续代码 if (error) { console.log('请求错误:', error); return; } // 确保response存在后再访问statusCode if (response) { console.log(response.statusCode + '-'.repeat(i)); i = (i + 1) % 20; // 简化重置逻辑 } else { console.log('未获取到响应数据'); } }); } // 按你的定时需求执行,示例为每秒一次 setInterval(sender, 1000);
关键修改点:
- 回调内先判断
error,存在则打印并return,跳过后续访问response的代码。 - 增加
response存在性判断,避免TypeError。 - 用
let和取模运算优化计数器逻辑。
二、推荐使用Promise+Async/Await写法(更易维护)
request库已被官方弃用,推荐改用支持Promise的HTTP库,比如request-promise-native或axios,这样可以用try catch直接捕获所有异步错误:
方案1:使用request-promise-native
先安装依赖:
npm install request-promise-native
代码示例:
const rp = require('request-promise-native'); const url = 'url.net'; let i = 0; async function sender() { try { // 开启resolveWithFullResponse才能拿到完整响应对象 const response = await rp({ url, resolveWithFullResponse: true }); console.log(response.statusCode + '-'.repeat(i)); i = (i + 1) % 20; } catch (error) { console.log('请求错误:', error); // 错误发生时不影响后续定时任务执行 } } setInterval(sender, 1000);
方案2:使用axios(更主流的选择)
axios是活跃维护的HTTP库,API更简洁:
先安装依赖:
npm install axios
代码示例:
const axios = require('axios'); const url = 'url.net'; let i = 0; async function sender() { try { const response = await axios.get(url); console.log(response.status + '-'.repeat(i)); i = (i + 1) % 20; } catch (error) { console.log('请求错误:', error.message); // 可根据错误类型做额外处理,比如ECONNRESET时自动重试 } } setInterval(sender, 1000);
核心原理说明
- 原代码的
try catch只能捕获同步代码和await后的异步错误,无法覆盖request的回调函数内部,因为回调的执行时机在try代码块结束之后。 - 改用Promise+Async/Await后,所有请求相关的错误都会被
try catch捕获,不会触发未捕获异常导致程序崩溃。 - 无论哪种写法,都必须确保在访问
response的属性前,先确认response或error的状态,避免TypeError。
内容的提问来源于stack exchange,提问作者C.Unbay
相关产品推荐
相关产品推荐

