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

