如何基于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
相关产品推荐
相关产品推荐

