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

Node程序未完成循环即退出问题求助(附JavaScript代码)

问题排查与修复

你的代码存在几个关键问题,导致程序异常退出、无法完成循环且不打印变量:

核心问题

  1. Promise提前resolve:你在创建Promise后立刻调用了resolve(),导致await根本没等setTimeout执行就继续执行后续代码。但setTimeout是异步任务,Node.js会先处理同步逻辑,之后等待定时器触发;如果此时没有其他待处理的异步任务,程序会在定时器触发后直接退出。
  2. SendMessage未处理异步操作:fetch是异步函数并返回Promise,但你的SendMessage既没有返回这个Promise,也没处理请求错误。一旦请求失败,会触发未捕获的Promise拒绝,直接终止程序。
  3. 缺少全局错误捕获:MessageLoop是async函数,但调用时未处理错误,任何内部异常都会导致程序直接崩溃。

修复后的代码

const fetch = require('node-fetch');
const config = require('./config.json');
const config2 = require('./config2.json');

// 改为async函数,处理fetch异步逻辑与错误
async function SendMessage(ChannelId, Authtoken, MessageToSend) {
  try {
    const response = await fetch(`https://discord.com/api/v9/channels/${ChannelId}/messages`, {
      headers: {
        "Authorization": `Bot ${Authtoken}`, // 根据你的认证方式调整,用户token用"Bearer ${Authtoken}"
        "Content-Type": "application/json" // 必须设置,Discord API要求JSON格式请求体
      },
      body: JSON.stringify({ content: MessageToSend, tts: false }), // 用JSON.stringify避免手动拼接的转义问题
      method: "POST"
    });

    if (!response.ok) {
      throw new Error(`请求失败: ${response.status} ${response.statusText}`);
    }

    console.log("消息发送成功");
    return await response.json();
  } catch (err) {
    console.error("发送消息出错:", err);
    throw err; // 抛出错误让上层处理
  }
}

const MessageLoop = async () => {
  for (let i = 0; i < 10; i++) {
    // 让Promise在setTimeout执行完成后再resolve
    await new Promise(resolve => {
      setTimeout(async () => {
        await SendMessage("1002639672528347206", "x", `测试消息${i}`);
        resolve();
      }, 5000);
    });
    console.log(`当前循环i值: ${i}`);
  }
};

// 调用并捕获全局错误,避免程序意外崩溃
MessageLoop().catch(err => {
  console.error("循环执行出错:", err);
});

修复说明

  • 调整Promise逻辑:将resolve()移到setTimeout的回调内部,并且等待SendMessage执行完成后再调用,确保每次循环都等待5秒+请求完成,再进入下一轮循环。
  • 完善SendMessage函数:用JSON.stringify生成请求体,避免手动拼接JSON的语法错误;添加Content-Type请求头,符合Discord API的要求;捕获请求错误并抛出,方便上层统一处理。
  • 添加全局错误捕获:调用MessageLoop时用.catch()捕获所有异常,防止程序因未处理错误直接崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:16:03