Telegraf.js开发Telegram机器人:语言变量全局变更问题求助
修复Telegraf.js机器人语言选择的全局变量问题
问题出在你用了全局变量lang,所有用户的语言选择都会覆盖这个变量,导致全局变更。要解决这个问题,需要为每个用户单独存储语言设置,最直接的方式是使用Telegraf的session中间件,或者持久化到数据库。
1. 启用Session中间件
首先需要安装并启用Telegraf的session功能,这样每个用户会有独立的会话存储:
const { Telegraf, session } = require('telegraf'); const bot = new Telegraf('你的机器人令牌'); // 启用内存session(开发环境可用,生产建议用持久化方案) bot.use(session());
2. 修改语言选择代码
删除全局的let lang;,把语言设置存储到当前用户的ctx.session中:
bot.start(async (ctx) => { // 初始化用户会话中的语言(可选,可设默认值) ctx.session.lang = ctx.session.lang ?? null; await ctx.reply("Выберете язык / Choose language: ", { reply_markup: { inline_keyboard: [ [ { text: "🇷🇺 Русский", callback_data: "ru" }, { text: "🇺🇸 English", callback_data: "en" } ], ] } }); }); bot.action('ru', async (ctx) => { // 将语言存入当前用户的会话 ctx.session.lang = "ru"; await ctx.answerCbQuery('Выбран русский язык'); // 可选:回复回调确认 await ctx.reply('Привет!'); }); bot.action('en', async (ctx) => { ctx.session.lang = "en"; await ctx.answerCbQuery('English selected'); await ctx.reply('Hello!'); });
3. 生产环境优化(可选)
内存session会在重启机器人后丢失数据,生产环境建议用持久化存储方案,比如:
telegraf-session-local:将会话存在本地文件telegraf-session-mongo:将会话存在MongoDB- 自定义数据库存储:根据用户ID(
ctx.from.id)在数据库中存储语言设置,每次请求时读取
核心逻辑都是把语言设置和用户ID绑定,避免全局变量的共享问题。
内容的提问来源于stack exchange,提问作者Minesweeper
相关产品推荐
相关产品推荐

