不和谐 | MYSQL 读自 mysql Table
Discord JS | MYSQL read from mysql Table
我正在尝试将我的 Discord Bot 连接到 MYSQL 数据库。我的架构是:
> CREATE DATABASE my_db;
CREATE TABLE Guilds (
guildId VARCHAR(100) NOT NULL PRIMARY KEY,
guildOwnerId VARCHAR(100) NOT NULL
);
CREATE TABLE GuildConfigurable (
guildId VARCHAR(100) NOT NULL PRIMARY KEY,
cmdPrefix VARCHAR(10) DEFAULT '<',
radioChannelId VARCHAR(100) DEFAULT ' ' NOT NULL,
memberCountId VARCHAR(100) DEFAULT ' ' NOT NULL,
AutoStartRadio VARCHAR (10) DEFAULT 'N'
);
我可以使用以下方式写入数据库:
client.on('guildCreate', (guild) => {
console.log('[INFO]'.green + ' The Bot has been added to a new Server! (' + guild + ')')
connection.query(
`INSERT INTO GuildConfigurable(guildId) VALUES ('${guild.id}')`
)
connection.query(
`INSERT INTO Guilds VALUES('${guild.id}', '${guild.ownerID}')`
)
});
但是当尝试使用以下方式读取数据时:
client.guilds.cache.forEach(guild => {
connection.promise().query(
`SELECT cmdPrefix FROM GuildConfigurable WHERE guildId = '${guild.id}'`
).then(result => {
guildCommandPrefix.set(guild.id, result[0][0].cmdPrefix);
}).catch(err => console.log(err));
})
我收到这个错误:
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:39:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:39:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
顺便说一句。添加此行时:
console.log(result[0][0])
我得到这个输出:
TextRow { cmdPrefix: '<' }
undefined
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:40:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
TextRow { cmdPrefix: '<' }
undefined
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:40:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
但我想将结果(“cmdPrefix”的值)写入一个变量以备后用。我做错了什么?
您似乎正在对不在数据库中的公会执行操作。
你只是在客户端加入公会时插入数据库,但正在从客户端所在的所有公会中获取命令前缀。必须有一个你的机器人所在的公会不在数据库中.
即使它在 TextRow 中显示 cmdPrefix: '<'
,但它返回未定义的事实意味着该记录不存在。
我建议您将 console.log(result[0][0])
更改为 console.log(guild.id, result[0][0])
。这将打印它试图与 TextRow 一起获取的公会。
仔细检查它尝试获取的每个公会 ID 实际上都在数据库中。
如果您确实遗漏了一些公会,您可以 运行 在未定义的条目上再插入一次,或者只使用一些条件逻辑,您的问题应该会得到解决。
guildCommandPrefix.set(guild.id, result[0][0].cmdPrefix || '<');
我正在尝试将我的 Discord Bot 连接到 MYSQL 数据库。我的架构是:
> CREATE DATABASE my_db;
CREATE TABLE Guilds (
guildId VARCHAR(100) NOT NULL PRIMARY KEY,
guildOwnerId VARCHAR(100) NOT NULL
);
CREATE TABLE GuildConfigurable (
guildId VARCHAR(100) NOT NULL PRIMARY KEY,
cmdPrefix VARCHAR(10) DEFAULT '<',
radioChannelId VARCHAR(100) DEFAULT ' ' NOT NULL,
memberCountId VARCHAR(100) DEFAULT ' ' NOT NULL,
AutoStartRadio VARCHAR (10) DEFAULT 'N'
);
我可以使用以下方式写入数据库:
client.on('guildCreate', (guild) => {
console.log('[INFO]'.green + ' The Bot has been added to a new Server! (' + guild + ')')
connection.query(
`INSERT INTO GuildConfigurable(guildId) VALUES ('${guild.id}')`
)
connection.query(
`INSERT INTO Guilds VALUES('${guild.id}', '${guild.ownerID}')`
)
});
但是当尝试使用以下方式读取数据时:
client.guilds.cache.forEach(guild => {
connection.promise().query(
`SELECT cmdPrefix FROM GuildConfigurable WHERE guildId = '${guild.id}'`
).then(result => {
guildCommandPrefix.set(guild.id, result[0][0].cmdPrefix);
}).catch(err => console.log(err));
})
我收到这个错误:
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:39:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:39:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
顺便说一句。添加此行时:
console.log(result[0][0])
我得到这个输出:
TextRow { cmdPrefix: '<' }
undefined
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:40:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
TextRow { cmdPrefix: '<' }
undefined
TypeError: Cannot read property 'cmdPrefix' of undefined
at /home/ubuntu/discord-bot-v2/main.js:40:55
at processTicksAndRejections (node:internal/process/task_queues:94:5)
但我想将结果(“cmdPrefix”的值)写入一个变量以备后用。我做错了什么?
您似乎正在对不在数据库中的公会执行操作。
你只是在客户端加入公会时插入数据库,但正在从客户端所在的所有公会中获取命令前缀。必须有一个你的机器人所在的公会不在数据库中.
即使它在 TextRow 中显示 cmdPrefix: '<'
,但它返回未定义的事实意味着该记录不存在。
我建议您将 console.log(result[0][0])
更改为 console.log(guild.id, result[0][0])
。这将打印它试图与 TextRow 一起获取的公会。
仔细检查它尝试获取的每个公会 ID 实际上都在数据库中。
如果您确实遗漏了一些公会,您可以 运行 在未定义的条目上再插入一次,或者只使用一些条件逻辑,您的问题应该会得到解决。
guildCommandPrefix.set(guild.id, result[0][0].cmdPrefix || '<');