当所有者不可见时,无法读取未定义的属性“用户”,导致 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

REACT JS:TypeError:无法读取未定义的属性“参数”

Mongoose TypeError:无法读取未定义的属性“googleID”