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

Discord.js开发文本冒险机器人无法正确响应用户后续选择问题求解

故障原因
  • 全局共享stage变量:所有用户共用同一个进度值,多用户操作时会互相覆盖进度,就算单用户使用,也会因为逻辑执行顺序出现同条消息多次触发的问题
  • 并行判断逻辑漏洞:你写的多个if判断是依次执行的,当用户在stage=0时发送a,第一个判断命中后将stage修改为1,后续的stage === 1的判断会立刻命中同一条消息,直接触发下一阶段逻辑,导致你以为机器人用了之前的答案。
  • 额外语法问题:你现有代码里message.channel.send('...);缺少闭合单引号,会导致运行报错。
修复实现

第一步:替换全局stage为用户独立进度存储

用Map结构存储每个用户的单独进度,键为用户ID,值为对应stage值。

第二步:调整判断结构,用else if保证单条消息仅触发一次逻辑

require("dotenv").config();

// 替换全局stage,存储每个用户的独立进度
const userStages = new Map();
let time = 0;
const { Client } = require('discord.js');
const client = new Client();

client.on('ready', () => {
  console.log(`${client.user.username} has arrived`);
}); 

client.on('message', (message) => {
  if (message.author.bot) return;
  const userId = message.author.id;
  // 初始化用户进度,如果不存在默认是0
  if (!userStages.has(userId)) {
    userStages.set(userId, 0);
  }
  const currentStage = userStages.get(userId);

  // 用else if保证同条消息只命中一个分支
  if (message.content === 'begin') {
    // 可补全begin对应的逻辑
  } else if (message.content === 'restart'){
    userStages.set(userId, 0);
    message.channel.send('Welcome adventurer! To begin, type "a"');
  } else if (message.content === 'a' && currentStage === 0) {
    message.channel.send('...');
    message.channel.send('...');
    message.channel.send('...');
    message.channel.send('Do you:');
    message.channel.send('a) ...');
    message.channel.send('b) ...');
    message.channel.send('c) ...');
    message.channel.send('d) ...');
    // 更新对应用户的进度
    userStages.set(userId, 1);
  } else if (message.content === 'a' && currentStage === 1) {
    message.channel.send('...');
    // 修复原有语法错误:补全单引号
    message.channel.send('...');
    message.channel.send('...');
    message.channel.send('...');
    message.channel.send('...');
    message.channel.send('Do you:');
    message.channel.send('a) ...');
    message.channel.send('b) ...');
    // 处理完后更新用户进度到下一阶段
    userStages.set(userId, 2);
  }    
});

client.login(process.env.DISCORDJS_BOT_TOKEN);
补充说明
  • 后续新增b、c、d选项的判断也用else if承接即可,保证单条消息只会触发一个对应分支的逻辑
  • 每个用户的进度独立存储,不会出现多用户互相干扰的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 08:15:04