【问题标题】:Discord JS | MYSQL read from mysql Table不和谐 JS | MYSQL 从 mysql 表中读取
【发布时间】:2021-06-05 17:34:15
【问题描述】:

我正在尝试将我的 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”的值)写入一个变量以供以后使用。我做错了什么?

【问题讨论】:

    标签: javascript mysql node.js discord.js mysql2


    【解决方案1】:

    您似乎正在对不在数据库中的公会执行操作。

    您只是在客户端加入公会时插入数据库,而是从客户端所在的所有公会中获取命令前缀。必须有一个您的机器人所在的公会不在数据库中。

    即使它在 TextRow 中显示 cmdPrefix: '&lt;',它返回 undefined 的事实意味着该记录不存在。

    我建议您将console.log(result[0][0]) 更改为console.log(guild.id, result[0][0])。这将打印它尝试获取的公会以及 TextRow。

    仔细检查它尝试获取的每个公会 id 是否实际上都在数据库中。

    如果您缺少一些公会,您可以在未定义的条目上运行另一个插入,或者只使用一些条件逻辑,您的问题应该得到解决。

    guildCommandPrefix.set(guild.id, result[0][0].cmdPrefix || '<');
    

    【讨论】:

    • 好的,现在我正在获取公会 ID 和前缀。但是我怎样才能只从一台服务器而不是从每台服务器获取这些信息?
    • 我不确定你的意思。你能再解释一下吗?
    • 我想发出命令来更改 Bot 前缀。这就是为什么我需要将它们保存在数据库中。所以我从数据库表中读取了服务器的前缀。所以我想向数据库“询问”特定 guildId 的前缀,然后将结果(仅前缀)写入变量中。希望你能理解我……我不善于解释……:D
    • 现在我得到了所有的 guildId 和前缀。所以我希望输出只是“
    • 查看 SQL 更新查询。 w3schools.com/sql/sql_update.aspUPDATE GuildConfigurable SET cmdPrefix = "!" WHERE guildId = "GUILD ID GOES HERE"
    猜你喜欢
    • 2021-07-14
    • 2019-01-18
    • 2022-01-26
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2021-01-11
    • 2021-05-25
    • 2021-10-03
    相关资源
    最近更新 更多