You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:31:03