Node.js中node-telegram-bot-api的menuOptions按钮不显示问题求助
Telegram机器人Inline按钮无法显示问题分析
问题核心原因
参数传递结构错误
你调用bot.sendMessage时,将menuOptions作为独立键传入选项对象,但node-telegram-bot-api要求reply_markup必须是选项的顶层属性。当前代码会生成如下无效结构:{ parse_mode: "HTML", menuOptions: { reply_markup: "..." } // 错误:API不识别menuOptions键 }正确的结构需要将
reply_markup直接放在选项顶层。手动JSON序列化冗余(非必改,但可优化)
node-telegram-bot-api支持直接传入对象形式的reply_markup,无需手动调用JSON.stringify,虽然序列化后也能工作,但增加了不必要的复杂度。
修正方案
方案1:调整参数传递方式
修改sendMessage的选项结构,直接提取menuOptions中的reply_markup:
if (text === '/start') { ust[chatId] = 0; bot.sendMessage(chatId, `${msg.from.first_name}, <b>Добро пожаловать</b> ✌️\n\nДоступные возможности:`, { parse_mode: "HTML", reply_markup: menuOptions.reply_markup // 直接传入reply_markup }) }
方案2:优化menuOptions导出结构(推荐)
修改menuOptions的导出,让它直接包含完整的合法选项,同时移除手动序列化:
// menuOptions.js module.exports = { startMenu: { parse_mode: "HTML", reply_markup: { inline_keyboard: [ [{text: 'Списки', callback_data: '/list'}], [{text: 'Частые вопросы', callback_data: '/quests'}, {text: 'Распространенные проблемы', callback_data: '/problems'}] ] } } }
调用时直接传入完整选项:
const { startMenu } = require('./menuOptions.js'); if (text === '/start') { ust[chatId] = 0; bot.sendMessage(chatId, `${msg.from.first_name}, <b>Добро пожаловать</b> ✌️\n\nДоступные возможности:`, startMenu) }
内容的提问来源于stack exchange,提问作者kh0dan
相关产品推荐
相关产品推荐

