Discord.JS UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“startsWith”

Posted

技术标签:

【中文标题】Discord.JS UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“startsWith”【英文标题】:Discord.JS UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'startsWith' of undefined 【发布时间】:2021-09-28 14:49:55 【问题描述】:

我目前正在尝试在 Discord 机器人中实现语音识别,但我一直遇到错误。我也是 Discord.JS 和整体编程的新手。

我从一个解释普通消息而不是语音的事件文件中复制了以下一些代码,它在那里工作正常。

以下行抛出“UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'startsWith' of undefined”:if (!msg.content.startsWith(prefix) || msg.author.bot) return;

我的整个文件:

const fs = require('fs');

module.exports = 
    name: "join",
    description: "Joins the VC that user is in",
    async execute(client, message, args, Discord) 
        const voiceChannel = message.member.voice.channel;
        const connection = await voiceChannel.join();

        if (!voiceChannel) return message.channel.send('Join a VC retard');
        const permissions = voiceChannel.permissionsFor(message.client.user);
        if (!permissions.has('CONNECT')) return message.channel.send("You don't have the correct permissions");
        if (!permissions.has('SPEAK')) return message.channel.send("You don't have the correct permissions");

        connection.client.on('speech', msg => 
            console.log(msg.content);
            const prefix = 'yo bot ' || 'Aries ' || 'Ares ' || 'yobot ';
            if (!msg.content.startsWith(prefix) || msg.author.bot) return;

            const args = msg.content.slice(prefix.length).split(/ +/);
            const cmd = args.shift().toLowerCase();

            const command = client.commands.get(cmd);

            if (command) command.execute(client, msg, args, Discord);
        )
    
 

【问题讨论】:

你能告诉我们connection.client.on('speech', msg =>函数中的msg是什么吗? 当我将 msg.content 记录到控制台时,它会打印出我所说的内容,但一秒钟后会打印出错误。 是的,我明白了,但这就是为什么我要求msg 而不是msg.content 来查看msg 是否像其他人所说的那样在日志中具有content 属性。 【参考方案1】:

在阅读它的startsWith 属性之前,您需要确保已定义消息内容。您可以使用optional chaining 来执行此操作。

if (!msg?.content?.startsWith(prefix) || msg.author.bot) return;

msg?.content?.startWith(prefix) 将返回未定义,如果:

msg 没有 content 属性 content 没有 startWith 属性

【讨论】:

【参考方案2】:

如果消息内容不是字符串,则不能使用该函数。

需要先检查消息内容是否存在:

if (!msg.content 
    || !msg.content.startsWith(prefix)
    || msg.author.bot
   ) ...

【讨论】:

当我将 msg.content 记录到控制台时,它会准确打印我所说的内容,但一秒钟后会打印错误。这会证明它是一个字符串吗?

以上是关于Discord.JS UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“startsWith”的主要内容,如果未能解决你的问题,请参考以下文章

Discord 错误错误 Discord.js 中的无效令牌

Discord 仅识别 discord.js 中的“ping”命令

错误“const Discord = require(discord.js) ^ ReferenceError: discord is not defined”

(Discord 机器人)当用户加入 Discord 服务器(discord.js)时,如何发送欢迎消息?

Discord.js 和 discord.js-commando 防止命令在特定通道中运行

使用 Discord 按钮的建议命令 Discord.JS