discord.js - 如何解决此错误“无法设置未定义的属性”
问题描述
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 未定义,该值也应该是“!”,代码就是这样(我假设,但不是很确定)。我该如何解决这个错误?
解决方案
应该返回的值是 !,但我们只在 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)
推荐阅读
- c++ - 矩阵表示为内存中的单个数组和矩阵乘法问题
- aem - 我们可以在 JobManager 中添加 ByteArrayInputStream 吗?
- react-native - 测试执行来自组件的功能确实挂载并且组件将接收道具
- android - 如何在我的应用程序中添加适当的大纲编辑文本?
- angularjs - angularjs主页遇到声明异常
- scala - 依赖于其他 3 个播放应用的播放应用
- spring-boot - 在谷歌云/应用引擎上部署我的 Spring Boot 应用程序后,无法打开 JDBC 连接以执行 DDL\n\tat
- python-3.x - 护士调度 CpSolver 卡在一些解决方案
- sql-server - 服务代理 - 队列中的消息切割器
- javascript - Jest - 如何使用模拟类实例