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

discord.js将问题Embed内容复制到回答Embed时出现undefined如何解决

问题根源

变量strf是.f指令分支内的局部变量,仅在该分支代码块内生效,.ab指令分支无法直接访问,因此取值为undefined。

解决方案

方案1:单问题场景(仅保留最新一条提问)

适合同一时间只处理最新提问的场景,实现最简单:

  1. 首先在所有指令判断逻辑的外层(例如switch语句之前的全局作用域位置)声明全局变量存储提问内容:
// 全局作用域下声明
let latestQuestion = ''
  1. 修改.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;
  1. 修改.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和对应提问的映射:

  1. 全局作用域下声明Map:
const userQuestionMap = new Map()
  1. .f分支存储对应用户的提问:
userQuestionMap.set(message.author.id, strf)
  1. 调整.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:36:05