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

如何将Node.js解析结果发送至Telegram Bot?报错求助

问题分析与解决方案

错误原因

  1. getString 函数未正确返回解析结果:原代码中 then 回调里的 return 仅作用于回调函数本身,不会让 getString 返回该值,导致函数默认返回 undefined,触发 Telegram API 的「消息文本为空」错误。
  2. 调用 getString 时未使用 await:直接将 Promise 对象传给 ctx.reply,而非实际的字符串内容。
  3. 代码拼写错误:tr.tostring() 应为 toString()(小写 t 会导致报错)。

修复后的代码

const { Telegraf, Markup } = require('telegraf');
const BOT_TOKEN = "*****************************************";
const bot = new Telegraf(BOT_TOKEN);
const axios = require("axios");
const cheerio = require("cheerio");

async function getString() {
  try {
    // 改用 await 替代 then,简化异步流程
    const response = await axios.get("https://www.federalreserve.gov/releases/h10/current/");
    const $ = cheerio.load(response.data);
    const table = $("table");
    // 直接取第一个表格的第4个tr(原代码循环首次就return,无需遍历)
    const targetTr = $(table[0]).find("tr").eq(4);
    const resultText = targetTr.text().trim(); // 去除多余空白字符
    console.log(resultText);
    return resultText;
  } catch (err) {
    console.log("Fetch error " + err);
    // 解析失败时返回提示文本,避免发送空消息
    return "数据获取失败,请稍后重试";
  }
}

bot.start((ctx) => {
    ctx.reply('restart!')
});

bot.command('test', async (ctx) => {
    ctx.reply("Click it", Markup.inlineKeyboard(
        [
            [Markup.button.callback('PEACE', 'PEACE')]
        ]
    ))
});

bot.action('PEACE', async (ctx) => {
    await ctx.answerCbQuery()
    // 等待 getString 返回实际文本后再发送
    const content = await getString();
    await ctx.reply(content)
});

bot.launch();

关键修复点

  • 重构 getString 为纯 await/try/catch 结构,确保函数返回解析后的文本或错误提示。
  • 在 bot.action 中使用 await 获取 getString 的实际返回值,再传给 ctx.reply。
  • 修正 toString() 拼写错误,并通过 trim() 去除文本中的多余空白,优化消息显示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:32:21