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

Telegraf开发Telegram bot时on、hears、command监听顺序及type参数问题

解答

1. on方法type参数的监听优先级规则

Telegraf的on方法没有预设的type固定优先级,匹配逻辑遵循两个原则:

  • 泛化类型优先于细分类型(如果泛化类型注册在前):on('message')覆盖所有消息类型,优先级高于on('text')、on('pinned_message')等细分消息类型;on('text')覆盖所有文本消息,优先级高于针对特定文本内容的匹配规则。只要泛化类型的监听先注册,匹配到对应事件后会直接终止后续匹配流程,后面的细分监听不会触发。
  • 同粒度类型的监听完全按代码注册顺序匹配:谁先注册谁先被匹配,匹配成功就终止后续流程。

2. on、hears、command三类监听的正确注册顺序

必须遵循从具体到泛化的注册顺序,从先到后排列如下:

  • 第一步注册command:命令规则最明确,优先级最高,放在最前面避免被其他规则拦截
  • 第二步注册hears:文本内容匹配规则比通用文本监听更具体,放在command之后
  • 第三步注册细分场景的on监听:比如on('pinned_message')、on('photo')、on('callback_query')这类特定事件监听
  • 第四步注册泛化兜底的on监听:比如on('text')、on('message')这类覆盖大范围事件的兜底规则,放在所有监听的最后面

修正后的示例代码

调整注册顺序即可解决/stringx命令被拦截的问题:

const { Telegraf } = require('telegraf')

const bot = new Telegraf(process.env.BOT_TOKEN)

// 命令放在最前
bot.command('stringx', (ctx) => ctx.reply('Hello'))
// 其次是hears匹配
bot.hears('string', (ctx) => ctx.reply('Hey there'))
// 兜底的text监听放在最后
bot.on('text', (ctx) => ctx.reply('👍'))

bot.launch();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:45:07