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

Node.js进程退出前发送Telegram GET请求失效问题求助

Node.js进程退出前发送Telegram消息失败的问题分析与解决

问题根源

你的代码存在三个核心问题导致请求被忽略:

  1. 异步操作未等待:axios.get是异步HTTP请求,调用后不会阻塞代码执行——你刚触发请求就立刻调用process.exit(),进程直接终止,请求根本没来得及完成发送。
  2. 事件处理逻辑混淆:exit事件属于进程退出的最后阶段,此时Node.js已经开始清理资源,无法执行任何异步I/O操作;而SIGINT、SIGTERM这类信号事件是可以先处理任务再主动退出的,但你把它们混在一起处理了。
  3. 参数绑定错误:onExit.bind(null, eventType)给函数传了事件类型参数,但onExit函数并没有接收这个参数,后续如果要区分退出原因会出问题。

解决方案

修改代码,区分不同事件的处理逻辑,用async/await等待异步请求完成后再退出进程:

process.stdin.resume();
const axios = require('axios');
// 请确保config已正确引入
const config = require('./path-to-your-config');

async function handleExit(eventType) {
  // exit事件触发时,进程已进入退出流程,无法执行异步操作,直接返回
  if (eventType === 'exit') {
    console.log('Process is exiting...');
    return;
  }

  try {
    // 等待Telegram请求完成
    await axios.get(`https://api.telegram.org/bot${config.telegram.BOT}/sendMessage`, {
      params: {
        chat_id: config.telegram.USER,
        parse_mode: 'markdown',
        text: `进程因${eventType}退出`
      },
      timeout: 5000 // 设置5秒超时,避免进程长时间挂起
    });
    console.log('退出通知已发送');
  } catch (err) {
    console.error('发送退出通知失败:', err.message);
  } finally {
    // 任务完成后主动退出进程
    process.exit();
  }
}

// 处理可中断的信号事件,先执行异步任务再退出
['SIGINT', 'SIGUSR1', 'SIGUSR2', 'uncaughtException', 'SIGTERM'].forEach((eventType) => {
  process.on(eventType, async () => {
    await handleExit(eventType);
  });
});

// 单独处理exit事件,仅做同步提示
process.on('exit', () => {
  handleExit('exit');
});

关键说明

  • 用async/await强制等待异步请求完成,确保Telegram消息发送成功后再终止进程。
  • 给axios请求设置超时时间,避免因请求超时导致进程一直无法退出。
  • 区分exit事件和其他信号事件:exit事件只能做同步操作,信号事件可以处理异步任务后主动退出。

内容的提问来源于stack exchange,提问作者aspirinemaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:55:20