discord.js将问题Embed内容复制到回答Embed时出现undefined如何解决
问题根源
变量strf是.f指令分支内的局部变量,仅在该分支代码块内生效,.ab指令分支无法直接访问,因此取值为undefined。
解决方案
方案1:单问题场景(仅保留最新一条提问)
适合同一时间只处理最新提问的场景,实现最简单:
- 首先在所有指令判断逻辑的外层(例如switch语句之前的全局作用域位置)声明全局变量存储提问内容:
// 全局作用域下声明 let latestQuestion = ''
- 修改
.f指令分支代码,将提问内容同步到全局变量:
case 'f': var strf = message.content.slice('.f'.length).trim() latestQuestion = strf // 同步提问内容到全局变量 const qembed = new Discord.MessageEmbed() .setThumbnail('png') .setTitle("Question") .setColor('WHITE') .addFields( { name: "提问用户:", value: `<@!${message.author.id}>` }, { name: '问题:', value: `${strf}` }, { name: '所属频道:', value: `${message.channel}` }, ) .setTimestamp() .setFooter('如需回答该问题,请输入".ab 回答内容"') message.channel.send({embeds: [qembed]}) message.delete() break;
- 修改
.ab指令分支代码,从全局变量取提问内容,同时修正原代码slice多写空格的问题:
case 'ab': // 原参数多写了前置空格,会导致回答内容丢失第一个字符,修正为'.ab' var strfa = message.content.slice('.ab'.length).trim() const abembed = new Discord.MessageEmbed() .setThumbnail('png') .setTitle("回答") .setColor('GREYPLE') .addFields( {name: "对应问题", value: latestQuestion}, {name: "回答内容", value: `${strfa}`}, {name: "回答用户", value: `<@!${message.author.id}>`} ) .setTimestamp() .setFooter('如有其他问题欢迎继续提问') message.channel.send({embeds: [abembed]}) message.delete() break;
方案2:多问题场景(支持同时存在多条提问)
如果需要支持多个用户同时提问不会被覆盖,可以用Map存储用户ID和对应提问的映射:
- 全局作用域下声明Map:
const userQuestionMap = new Map()
.f分支存储对应用户的提问:
userQuestionMap.set(message.author.id, strf)
- 调整
.ab指令使用规则,要求回答时@提问用户,从Map中取对应提问:
case 'ab': const targetUser = message.mentions.users.first() if(!targetUser) return message.reply('请@提问用户后再提交回答').then(msg => setTimeout(() => msg.delete(), 3000)) if(!userQuestionMap.has(targetUser.id)) return message.reply('未找到该用户的提问记录').then(msg => setTimeout(() => msg.delete(), 3000)) const question = userQuestionMap.get(targetUser.id) var strfa = message.content.slice('.ab'.length).replace(/<@!?\d+>/, '').trim() // 去掉@的用户标签,保留纯回答内容 // 剩余Embed代码中问题字段直接用question变量即可
额外注意
原.ab指令的slice(' .ab'.length)写法多添加了一个前置空格,会导致正常输入的回答内容第一个字符被误删,需要修正为slice('.ab'.length)。
内容的提问来源于stack exchange,提问作者I need Help
相关产品推荐
相关产品推荐

