Telegraf.JS i18n在WizardScene报TypeError: 读取undefined的t属性失败
故障原因
中间件注册顺序错误。
Telegraf 中间件严格按照bot.use()的注册顺序依次执行,先注册的中间件优先接收请求,只有当前中间件调用next()时,请求才会流转到下一个注册的中间件。
你当前的注册逻辑是先挂载场景中间件、后挂载i18n中间件:
- 第一阶段执行正常,是因为首次进入WizardScene的触发请求,在执行场景第一步骤时已经完成了i18n注入
- 当第一步骤执行完调用
ctx.wizard.next()进入第二阶段后,后续用户发送的请求会先被排在前面的场景中间件拦截,直接转发给WizardScene的第二步骤处理函数,根本不会流转到后面的i18n中间件,因此ctx.i18n为undefined,调用t方法直接触发程序崩溃。
修复方案
调整中间件注册顺序,将i18n中间件放在场景中间件之前注册,保证所有请求(包括场景内各步骤触发的请求)都先经过i18n实例注入,再进入场景逻辑处理。
修正后的中间件注册代码:
// 先注册i18n中间件,提前向ctx挂载i18n实例 bot.use(i18n.middleware()) // 后注册场景中间件 bot.use(stage.middleware());
注意:所有需要在WizardScene场景步骤中调用的全局中间件(比如权限校验、session、i18n等),都必须在
stage.middleware()之前注册,否则场景内无法获取到中间件挂载到ctx上的属性和方法。
内容的提问来源于stack exchange,提问作者user18998426
相关产品推荐
相关产品推荐

