当所有者不可见时,无法读取未定义的属性“用户”,导致 BOT 崩溃
Posted
技术标签:
【中文标题】当所有者不可见时,无法读取未定义的属性“用户”,导致 BOT 崩溃【英文标题】:Cannot read property "user" of undefined when owner is not visible, crashing the BOT 【发布时间】:2021-04-21 12:42:46 【问题描述】:我的 BOT 中有这件事。使用此代码,我可以从用户所在的服务器获取一些信息:
if (command === `server`)
message.react("????");
const owner = message.guild.owner.user.tag;
const embedServer = new Discord.MessageEmbed()
.setTitle(`**:books: Server Info: $message.guild.name**`)
.setDescription(`Some information about the server you're on.`)
.addFields(
name: ':person_raising_hand: ・ Member Count', value: message.guild.memberCount, inline: true ,
name: ':calendar_spiral: ・ Creation Date', value: message.guild.createdAt, inline: true ,
name: ':globe_with_meridians: ・ Server Region', value: (message.guild.region).toUpperCase(), inline: true ,
name: ':crown: ・ Server Owner', value: owner, inline: true ,
)
.setFooter(`$botnv`)
.setColor('#f04747')
message.channel.send(embedServer).catch(err => message.channel.send(":warning: Error!"));
;
它在我的私人服务器上工作得很好,但是一旦我在 BOT 无法看到所有者是谁的服务器上测试它,它就会崩溃。我希望它发送一条消息说它找不到它们。我尝试过的一切都没有奏效。 if(!user) return 在 const 下不起作用, .catch(err) 也不起作用。我被卡住了。
【问题讨论】:
你试过const owner = message.guild.owner;
然后if(!owner)
吗?
成功了!太感谢了!我是新手,所以我不知道你是否会得到额外的东西,但如果你想把它作为答案,我会把它设置为解决方案。
是的,谢谢,刚刚添加了答案! :)
【参考方案1】:
您应该首先检查所有者是否存在,而不是获取可能是 undefined
的东西的属性。
我建议改用这个:
const owner = message.guild.owner;
if(!owner)
console.log("Unable to find owner");
else
let tag = owner.user.tag;
因此,要将其集成到您的代码中,您可以执行以下操作:
if (command === `server`)
message.react("?");
const owner = message.guild.owner;
if(owner)
const embedServer = new Discord.MessageEmbed()
.setTitle(`**:books: Server Info: $message.guild.name**`)
.setDescription(`Some information about the server you're on.`)
.addFields(
name: ':person_raising_hand: ・ Member Count', value: message.guild.memberCount, inline: true ,
name: ':calendar_spiral: ・ Creation Date', value: message.guild.createdAt, inline: true ,
name: ':globe_with_meridians: ・ Server Region', value: message.guild.region.toUpperCase(), inline: true ,
name: ':crown: ・ Server Owner', value: owner.user.tag, inline: true ,
)
.setFooter(`$botnv`)
.setColor('#f04747')
message.channel.send(embedServer).catch(err => message.channel.send(":warning: Error!"));
else
message.channel.send("Unable to find owner");
;
另外,另一件事是您不需要在message.guild.region
周围加上括号。 :)
【讨论】:
【参考方案2】:您可以使用 try/catch 语句并获取错误并将消息发送到频道
if (command === `server`)
message.react("?");
try
const owner = message.guild.owner.user.tag;
const embedServer = new Discord.MessageEmbed()
.setTitle(`**:books: Server Info: $message.guild.name**`)
.setDescription(`Some information about the server you're on.`)
.addFields(
name: ':person_raising_hand: ・ Member Count',
value: message.guild.memberCount,
inline: true
,
name: ':calendar_spiral: ・ Creation Date',
value: message.guild.createdAt,
inline: true
,
name: ':globe_with_meridians: ・ Server Region',
value: (message.guild.region).toUpperCase(),
inline: true
,
name: ':crown: ・ Server Owner',
value: owner,
inline: true
, )
.setFooter(`$botnv`)
.setColor('#f04747')
message.channel.send(embedServer);
catch (error)
console.log(error); //Console Log Error
return message.channel.send(":warning: Error!");
;
;
了解更多关于 try/catch here
【讨论】:
虽然这在技术上是一种解决方案,但它可能会由于其他原因而不断失败,这意味着它总是会运行 catch 块。以上是关于当所有者不可见时,无法读取未定义的属性“用户”,导致 BOT 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
尝试访问节点 js 中的 req.user 属性时无法读取未定义的属性“用户名”
TypeError:尝试上传图像时无法读取未定义的属性“路径”
“错误TypeError:无法读取未定义的属性'name'” Angular