如何将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}`}) }); } }
问题根源
- 回调参数顺序错误:原生
mysql模块的query方法回调参数顺序为(err, results, fields),你将第一个参数错误当作查询结果使用。若查询过程中出现错误,results会是undefined,直接调用会触发类型错误。 - 未处理查询错误:代码中没有捕获查询阶段的异常,一旦数据库连接或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
相关产品推荐
相关产品推荐

