Discord.js报错:message is not defined 求助(Node.js新手)
解决Discord.js userinfo命令中的ReferenceError: message is not defined错误
首先,先明确你遇到的错误:
(node:6312) UnhandledPromiseRejectionWarning: ReferenceError: message is not defined at userInfo (C:\Users\deris\Desktop\Проекты\Node.js\discord.js\JSBot-master\commands\userinfo.js:10:23) at Object.exports.run (C:\Users\deris\Desktop\Проекты\Node.js\discord.js\JSBot-master\commands\userinfo.js:5:26)
你的原始代码如下:
const Discord = require('discord.js'); exports.run = async (bot, message, args) => { let userInfMent = message.guild.member(message.mentions.users.first() || message.guild.members.get(args[0])) message.channel.send(userInfo(userInfMent)); } function userInfo(user) { const Discord = require('discord.js'); let userInfMent = message.guild.member(message.mentions.users.first() || message.guild.members.get(args[0])) var userCreated = userInfMent.createdAt.toString().split(' '); var lastMsg = userInfMent.lastMessage.createdAt.toString().split(' ') const userInfoEmbed = new Discord.RichEmbed() .addField('Никнейм: ', userInfMent.username) .addField('Тег: ', userInfMent.tag) .addField('ID: ', userInfMent.id) .addField('Аккаунт был создан: ', userCreated[1] + ', ' + userCreated[2] + ', ' + userCreated[3]) .addField('Последнее сообщение: ', userInfMent.lastMessage + ' в ' + lastMsg[1] + ', ' + lastMsg[2] + ', ' + lastMsg[3] + ', ' + lastMsg[4]) .addField('Статус: ', userInfMent.presence.status) .setColor('RANDOM') .setThumbnail(userInfMent.avatarURL); return userInfoEmbed }
错误原因分析
这个报错的核心是作用域问题:
message和args变量只在exports.run函数的范围内有效,你在userInfo函数里直接调用它们,函数根本找不到这两个变量,所以抛出了ReferenceError。- 而且你已经把目标用户对象
userInfMent作为参数传给了userInfo函数,但在函数内部又重复去获取用户,完全是多余操作,还引发了错误。
除此之外还有几个需要修正的小问题:
- 重复引入
Discord模块,顶部已经引入过了,函数内不需要再次引入。 RichEmbed在Discord.js v12及以上版本已经被废弃,应该使用MessageEmbed。- 你传入的
user是GuildMember对象,直接访问.username、.tag等属性会出错,需要通过.user属性获取对应的用户信息。 - 如果用户从未发送过消息,
user.lastMessage会是null,直接访问.createdAt会导致报错,需要做容错处理。
修复后的完整代码
const Discord = require('discord.js'); exports.run = async (bot, message, args) => { // 获取目标用户:优先提及用户,其次通过ID查找,默认是命令发起者 const targetUser = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.member; // 调用userInfo函数并发送嵌入消息 const userEmbed = userInfo(targetUser); message.channel.send({ embeds: [userEmbed] }); } function userInfo(member) { // 从GuildMember对象中提取用户信息 const user = member.user; // 处理账号创建时间 const userCreated = user.createdAt.toString().split(' '); const formattedCreationDate = `${userCreated[1]}, ${userCreated[2]}, ${userCreated[3]}`; // 处理最后一条消息,添加容错 let lastMsgInfo = "从未发送过消息"; if (member.lastMessage) { const lastMsg = member.lastMessage.createdAt.toString().split(' '); lastMsgInfo = `${member.lastMessage.content} в ${lastMsg[1]}, ${lastMsg[2]}, ${lastMsg[3]}, ${lastMsg[4]}`; } // 使用MessageEmbed替代废弃的RichEmbed const userInfoEmbed = new Discord.MessageEmbed() .addField('Никнейм: ', user.username) .addField('Тег: ', user.tag) .addField('ID: ', user.id) .addField('Аккаунт был создан: ', formattedCreationDate) .addField('Последнее сообщение: ', lastMsgInfo) .addField('Статус: ', member.presence?.status || 'неизвестен') .setColor('RANDOM') .setThumbnail(user.displayAvatarURL({ dynamic: true })); // 使用displayAvatarURL支持动态头像 return userInfoEmbed; }
关键修改点说明
- 作用域修复:
userInfo函数现在只依赖传入的member参数,不再尝试访问外部的message/args变量。 - 用户获取优化:添加了默认值(命令发起者),并使用
cache.get替代已废弃的get方法(Discord.js v12+要求从缓存中获取成员)。 - 废弃API替换:用
MessageEmbed替换RichEmbed,并调整消息发送方式为{ embeds: [userEmbed] }(v13+要求的格式)。 - 容错处理:对
lastMessage和presence.status做了空值判断,避免因用户无消息/离线导致的报错。 - 头像优化:使用
displayAvatarURL({ dynamic: true })支持用户的动态GIF头像。
内容的提问来源于stack exchange,提问作者Derise
相关产品推荐
相关产品推荐

