如何编写Discord.js斜杠命令以查询MySQL数据库?
如何编写Discord.js斜杠命令以查询MySQL数据库?
兄弟,我刚学discord.js和JS的时候也卡过这个点!既然你已经在index.js里连好MySQL了,那接下来搞斜杠命令查数据库其实没那么难,我给你一步步捋:
1. 先注册你的斜杠命令
首先得让Discord识别你的命令,不管你用djs-commander还是手动注册,咱先整个简单的例子。比如做一个/getuser命令,用来查询users表里的用户信息,需要用户输入用户ID作为参数。
如果你用djs-commander的话,可以在commands文件夹里新建一个文件,比如getUser.js:
const { SlashCommandBuilder } = require('discord.js'); const mysql = require('mysql2/promise'); // 或者你用的mysql模块 module.exports = { data: new SlashCommandBuilder() .setName('getuser') .setDescription('查询数据库里的用户信息') .addStringOption(option => option.setName('userid') .setDescription('要查询的用户ID') .setRequired(true)), async execute(interaction) { // 这里写命令执行逻辑,后面讲 }, };
要是你不用djs-commander,也可以在index.js里手动注册(适合测试,全局命令要等1小时左右生效,服务器级命令马上生效):
// 在客户端ready事件里注册 client.on('ready', async () => { const guild = client.guilds.cache.get('你的服务器ID'); // 替换成你的服务器ID await guild.commands.create({ name: 'getuser', description: '查询数据库里的用户信息', options: [ { name: 'userid', type: 3, // STRING类型 description: '要查询的用户ID', required: true, }, ], }); console.log('斜杠命令注册完成!'); });
2. 在命令里写MySQL查询逻辑
现在回到命令的execute函数里,我们要获取用户输入的参数,然后查数据库,再把结果发回去。
首先,确保你已经有了MySQL连接配置,比如你之前在index.js里的连接:
// 假设你已经有这样的连接配置 const dbConfig = { host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, };
然后在execute函数里:
async execute(interaction) { // 先获取用户输入的userid const userId = interaction.options.getString('userid'); try { // 建立数据库连接(或者用连接池更高效) const connection = await mysql.createConnection(dbConfig); // 重点!用参数化查询防止SQL注入,绝对不能直接拼用户输入! const [rows] = await connection.execute('SELECT * FROM users WHERE id = ?', [userId]); await connection.end(); // 关闭连接 if (rows.length === 0) { return interaction.reply(`找不到ID为 ${userId} 的用户哦!`); } // 格式化查询结果,发给用户 const user = rows[0]; await interaction.reply(`查询到用户信息:\nID: ${user.id}\n用户名: ${user.username}\n注册时间: ${user.created_at}`); } catch (error) { console.error('数据库查询出错:', error); await interaction.reply('查询数据库时出错了,请稍后再试!'); } }
3. 实用优化建议(可选)
- 用连接池代替单次连接:连接池可以复用连接,性能更好,不用每次都新建/关闭连接:
// 在文件顶部创建连接池 const pool = mysql.createPool(dbConfig); // 然后在execute里用pool.query const [rows] = await pool.query('SELECT * FROM users WHERE id = ?', [userId]); // 不用手动关闭连接,连接池会自动管理
- 添加权限控制:如果不想让所有人都能查数据库,可以在命令开头加权限判断:
if (!interaction.member.permissions.has('Administrator')) { return interaction.reply('你没有权限执行这个命令!'); }
- 用Embed美化消息:让返回的信息更美观易读:
const { EmbedBuilder } = require('discord.js'); // ...查询到user后 const embed = new EmbedBuilder() .setTitle(`用户信息 ${user.id}`) .addFields( { name: '用户名', value: user.username, inline: true }, { name: '注册时间', value: user.created_at.toLocaleString(), inline: true } ) .setColor('#00ff00'); await interaction.reply({ embeds: [embed] });
这样一套下来,用户输入/getuser userid:123就能查到数据库里的用户信息啦!你可以根据自己的需求修改查询语句和返回内容~
备注:内容来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

