首页 > 解决方案 > 如何解决此错误“无法设置未定义的属性”

问题描述

const { Client, Intents, MessageEmbed } = require('discord.js');
let client = new Client({ intents: [Intents.FLAGS.GUILDS,Intents.FLAGS.GUILD_MESSAGES] });
const dotenv = require('dotenv');
const Keyv = require('keyv');
const keyv = new Keyv();
dotenv.config();

client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
});

client.on('messageCreate', async (msg) => {
    let number = msg.content.split(' ')[1];
    if (msg.content === '!ping') {
        msg.channel.send('ping!')
    }
`
    const getGuildPrefix = async () => {
        const prefixMap = await keyv.get('prefix');
        return prefixMap ?. [msg.guild.id] || "!"
    }

// Sets the prefix to the current guild.
    const setGuildPrefix = async (prefix) => {
        const prefixMap = await keyv.get('prefix');
        prefixMap[msg.guild.id] = prefix;
        await keyv.set('prefix', `${prefixMap}`);
    }

    let prefix = await getGuildPrefix();
// Get prefix command.
    if ((msg.content === `${process.env.prefix}prefix`) || (msg.content === `${prefix}prefix`)) {
        msg.channel.send(`Your server prefix is ${prefix}`)
    }
})
client.login(process.env.token);

所以这段代码的作用是检索特定服务器的前缀,其中不同的服务器具有不同的前缀,所以我使用 keyv 包来存储前缀,但我收到一个错误,这是错误消息

    prefixMap[msg.guild.id] = prefix;
                                ^
TypeError: Cannot set properties of undefined (setting '857122654976606239')
    at setGuildPrefix

这里如果键中的值为空,那么它应该返回值“!” 默认。所以这几乎是我昨天做的代码,但我稍微编辑了代码以修复 getGuildPrefix 中的错误,现在我收到了这个错误。这两个错误都是由于未定义引起的,但我使用可选链接来修复第一个错误,并且 getGuildPrefix 工作正常,但现在 setGuildPrefix 部分出现错误。问题是即使 PrefixMap 未定义,该值也应该是“!”,代码就是这样(我假设,但不是很确定)。我该如何解决这个错误?

标签: discord.js

解决方案


应该返回的值是 !,但我们只在 getGuildPrefix 中给出了它,但我们不能在 setGuildPrefix 中进行可选链接,因为它会给出像左手一样的错误,所以如果 keyql 不再从 db 返回值,然后我们可以在 if 语句中再次启动它,但使用另一个 if 语句。为什么我们不能在 getGuildPrefix idk 中使用这种技术,但我们可以在 setGuildPrefix 中使用它,我们可以在 getGuildPrefix 中使用可选链接,现在错误已修复,代码正常工作

client.on('messageCreate', async (msg) => {
    let number = msg.content.split(' ')[1];
    if (msg.content === '!ping') {
        msg.channel.send('ping!')
    }


// Use this function to get the prefix in other files.
// Use like `const prefix = await getGuildPrefix();`
    const getGuildPrefix = async () => {
        const prefixMap = await keyv.get('prefix');
        return prefixMap ?. [msg.guild.id] || "!"
    }

// Sets the prefix to the current guild.
    const setGuildPrefix = async (prefix) => {
        let prefixMap = await keyv.get('prefix');
        if (!prefixMap)
    {
     prefixMap = "!";
    }
        prefixMap[msg.guild.id] = prefix;
        await keyv.set('prefix', `${prefixMap}`);
    }

    let prefix = await getGuildPrefix();
// Get prefix command.
    if ((msg.content === `${process.env.prefix}prefix`) || (msg.content === `${prefix}prefix`)) {
        msg.channel.send(`Your server prefix is ${prefix}`)
    }
})
client.login(token)

推荐阅读