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

