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

Discord.js从用户消息获取args赋值时出现undefined如何解决

问题原因
  • 数组操作顺序错误:Array.shift()方法会移除数组的第一个元素并直接修改原数组,你在尝试访问args[1]之前就执行了shift操作,原数组长度减1,原本索引为1的参数值会移动到索引0的位置,此时访问args[1]自然返回undefined。
  • 全局变量使用不规范:将args定义为全局变量,多条消息同时触发时会出现变量覆盖问题,跨函数依赖全局变量取值的方式也极易出现时序异常。
  • 非必要的await使用:args是普通数组类型,你在函数中对args[1]添加了await关键字,await仅用于处理Promise异步对象,对普通值使用属于错误写法。
修复方案

修改思路为将args改为局部变量,直接作为参数传递给replyWithInvite函数,调整参数取值的索引:

client.on('message', async message => {
  if(!message.content.startsWith(prefix) || message.author.bot) {
    return;
  }
  console.log("this did register");
  // 将args改为局部变量,避免全局污染
  const args = message.content.slice(prefix.length).split(/ +/);
  console.log("args: ", args);
  const command = args.shift().toLowerCase();

  if(command === 'generate') {
    console.log("generate command used");
    // 把处理后的args作为参数传入目标函数
    await replyWithInvite(message, args);
  }
})

async function replyWithInvite(message, args) {
  let invite = [];
  // shift后args[0]就是用户输入的数量参数,转换为数字,非法输入默认生成1个
  const count = parseInt(args[0]) || 1;
  console.log("生成数量:", count);
  message.reply(`Here are your ${count} time use invites, which expire in 10 minutes: `)
  for(let i = 0; i < count; i++) {
    invite.push(await message.channel.createInvite(
    {
      maxAge: 10 * 60 * 1000, // 邀请链接最大有效时长,单位为毫秒
      maxUses: 1 // 邀请链接最大可使用次数
    }
    ))
    message.channel.send(invite[i] ? `${invite[i]}` : "There has been an error during the creation of the invite.");
  }
  message.channel.send("That's it!")
} 

修复后你发送[前缀]generate 5这类命令,就会生成对应数量的邀请链接。

内容的提问来源于stack exchange,提问作者S..

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:51:00