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

如何基于discord.js与MongoDB Atlas实现Discord注册命令

Discord 注册命令存储成员数据实现方案

原有代码问题

  • 命令匹配用了严格相等判断,无法解析用户动态输入的ign、level参数
  • 未做参数校验,level定义为数字类型,直接传字符串会导致写入异常
  • 未调用MongoDB的save()方法,构造完数据模型后不会实际写入数据库
  • 未做重复注册拦截,同一用户可重复提交数据
  • 未给用户返回操作结果提示,用户无法知道注册是否成功
  • 错误使用Discord用户名作为唯一标识,用户名可被用户随意修改,数据关联不可靠

修正后代码

Schema.js(数据模型定义)

给discordid加唯一索引防止重复注册,补全必要的字段约束:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const ProfileSchema = new Schema({
  discordid: {
    type: String,
    required: true,
    unique: true
  },
  ign: {
    type: String,
    required: true
  },
  level: {
    type: Number,
    required: true,
    min: 1
  }
});

module.exports = mongoose.model('profile', ProfileSchema);

bot.js(机器人逻辑)

const { Client } = require('discord.js');
const mongoose = require('mongoose');
const Profile = require('./Schema.js');
// 初始化机器人,开启必要的权限意图
const client = new Client({ 
  intents: ["Guilds", "GuildMessages", "MessageContent"] 
});

// 连接MongoDB数据库
mongoose.connect('替换为你的MongoDB连接地址', {
  useNewUrlParser: true,
  useUnifiedTopology: true
}).then(() => console.log('数据库连接成功')).catch(err => console.error('数据库连接失败:', err));

client.on("messageCreate", async msg => {
  // 忽略机器人自身发送的消息,防止循环响应
  if (msg.author.bot) return;
  // 非注册命令直接跳过
  if (!msg.content.startsWith('!register')) return;

  try {
    // 解析命令参数
    const args = msg.content.trim().split(/\s+/);
    args.shift(); // 剔除开头的!register字段
    const params = {};
    for (const arg of args) {
      const [key, val] = arg.split(':');
      if (key && val) params[key.trim()] = val.trim();
    }

    // 校验必填参数
    if (!params.ign || !params.level) {
      return msg.reply("命令格式错误,正确用法:`!register ign:你的游戏ID level:你的游戏等级`");
    }
    // 校验等级格式
    const userLevel = Number(params.level);
    if (isNaN(userLevel) || userLevel < 1) {
      return msg.reply("等级参数必须为大于0的有效数字");
    }

    // 拦截重复注册
    const existUser = await Profile.findOne({ discordid: msg.author.id });
    if (existUser) {
      return msg.reply("你已经完成注册,无需重复提交");
    }

    // 写入数据到数据库
    const newUser = new Profile({
      discordid: msg.author.id,
      ign: params.ign,
      level: userLevel
    });
    await newUser.save();

    return msg.reply(`注册成功!\n游戏ID:${params.ign}\n当前等级:${userLevel}`);
  } catch (err) {
    console.error('注册流程异常:', err);
    return msg.reply("注册失败,请稍后再试");
  }
});

client.login('替换为你的Discord机器人Token');

部署注意事项

  • 提前到Discord开发者后台,为机器人开启Message Content Intent开关,否则机器人无法读取用户发送的消息内容
  • 安装必要依赖:执行npm install discord.js mongoose
  • 代码中两处占位符(MongoDB连接地址、机器人Token)需要替换为你自己的实际配置值
  • 存储时使用Discord用户ID作为唯一标识而非用户名,用户ID永久固定不会变更,后续需要获取用户名时可通过client.users.fetch(用户ID)拉取实时信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:09:25