You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MySQL与Discord.js连接?代码运行报错求解决方案

MySQL与Discord.js连接异常排查及解决方案

问题背景

尝试通过以下代码实现MySQL与Discord.js的连接,运行/test斜杠命令时触发TypeError: Cannot read properties of undefined (reading '0')错误。

涉事代码

const { SlashCommandBuilder } = require("discord.js");
const mysql = require("mysql");
const connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "",
    database: "25m"
});

connection.connect(function(err) {
    if(err) throw err;
});
  
module.exports = {
    data: new SlashCommandBuilder()
    .setName("test")
    .setDescription("test"),
  
    async execute (client, interaction) {
        
        connection.query(`SELECT * FROM cypter WHERE id = '2'`,function(result) {
                interaction.reply({content: `Result:${result}`})
        });
    }
}

问题根源

  1. 回调参数顺序错误:原生mysql模块的query方法回调参数顺序为(err, results, fields),你将第一个参数错误当作查询结果使用。若查询过程中出现错误,results会是undefined,直接调用会触发类型错误。
  2. 未处理查询错误:代码中没有捕获查询阶段的异常,一旦数据库连接或SQL语句出错,会直接导致命令执行失败。

修复后的代码

const { SlashCommandBuilder } = require("discord.js");
const mysql = require("mysql");
const connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "",
    database: "25m"
});

connection.connect(function(err) {
    if(err) throw err;
});
  
module.exports = {
    data: new SlashCommandBuilder()
    .setName("test")
    .setDescription("test"),
  
    async execute (client, interaction) {
        connection.query(`SELECT * FROM cypter WHERE id = '2'`, function(err, results) {
            // 优先处理错误
            if (err) {
                return interaction.reply({ content: `查询失败:${err.message}`, ephemeral: true });
            }
            // 处理空结果
            if (results.length === 0) {
                return interaction.reply({ content: "未找到匹配数据", ephemeral: true });
            }
            // 返回格式化后的结果
            interaction.reply({ content: `查询结果:${JSON.stringify(results[0])}` });
        });
    }
}

更优替代方案:使用mysql2(Promise化库)

原生mysql模块的回调风格与Discord.js的异步逻辑不契合,推荐使用mysql2库,它支持async/await语法,且自带连接池功能,更适合Discord机器人开发。

步骤1:安装依赖

npm install mysql2

步骤2:示例代码

const { SlashCommandBuilder } = require("discord.js");
const mysql = require("mysql2/promise");

// 创建连接池(推荐使用连接池而非单连接,提升性能)
const pool = mysql.createPool({
    host: "localhost",
    user: "root",
    password: "",
    database: "25m",
    connectionLimit: 10,
    queueLimit: 0
});
  
module.exports = {
    data: new SlashCommandBuilder()
    .setName("test")
    .setDescription("test"),
  
    async execute (client, interaction) {
        try {
            // 使用参数占位符防止SQL注入,同时支持async/await
            const [results] = await pool.query(`SELECT * FROM cypter WHERE id = ?`, [2]);
            
            if (results.length === 0) {
                return interaction.reply({ content: "未找到匹配数据", ephemeral: true });
            }
            
            interaction.reply({ content: `查询结果:${JSON.stringify(results[0])}` });
        } catch (err) {
            interaction.reply({ content: `查询失败:${err.message}`, ephemeral: true });
        }
    }
}

方案优势

  • 语法更简洁,与Discord.js的异步执行逻辑完全适配
  • 连接池自动管理数据库连接,避免单连接的性能瓶颈
  • 支持参数占位符,有效防止SQL注入攻击

内容的提问来源于stack exchange,提问作者Kaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:50:33