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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:40:35