如何将Node.js解析结果发送至Telegram Bot?报错求助
问题分析与解决方案
错误原因
getString函数未正确返回解析结果:原代码中then回调里的return仅作用于回调函数本身,不会让getString返回该值,导致函数默认返回undefined,触发 Telegram API 的「消息文本为空」错误。- 调用
getString时未使用await:直接将 Promise 对象传给ctx.reply,而非实际的字符串内容。 - 代码拼写错误:
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
相关产品推荐
相关产品推荐

