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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:03:09