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
相关产品推荐
相关产品推荐

