Discord.js经济系统故障求助:MongoDB仅存储单个用户数据
Discord.js 经济系统余额查询异常问题
我用Discord.js开发了一套经济系统,其中包含查询他人余额的命令。目前遇到问题:MongoDB仅能存储单个用户的数据——当数据库为空时创建第一个用户的资料后,其他成员查询自身余额时,显示的却是第一个用户的余额,而非自己的。尝试多种方法仍无法解决,恳请帮助。
原代码片段
消息处理逻辑
if (message.author.bot) return; let member = message.mentions.members.first(); if (member) { if (message.content.match('!ponyo balance') && profileSchema.findOne({ memberId: member.id, guildId: member.guild.id })) { console.log('trying to execute balance.createBalance() with the user id: ' + member.id) const profileBalance = await balance.createBalance(member); console.log(`profileBalance: ${profileBalance}`) await message.reply(`${message.mentions.members.first()} has ${profileBalance.coins} coins! :D`); } } })
createBalance 函数
const Balance = require('./profileSchema') const mongoose = require('mongoose') //create profile thingy async function createBalance(member) { if (Balance.findOne({ memberId: member.id })) { let balanceProfile = await Balance.findOne({ memberId: member.id }) if (balanceProfile) { return balanceProfile; } else { balanceProfile = await new Balance({ userID: member.id, serverID: member.guild.id }); await balanceProfile.save().catch(err => console.log(err)); console.log("returning: " + balanceProfile.toString()); return balanceProfile; }}} module.exports = { createBalance };
Mongoose Schema 定义
const mongoose = require('mongoose'); const profileSchema = new mongoose.Schema({ userID: { type: String, require: true, unique: true}, serverID: { type: String, require: true }, coins: { type: Number, default: 100 }, bank: { type: Number } }) const model = mongoose.model('ProfileModels', profileSchema); module.exports = model;
问题根源
- 字段名不匹配:Schema 中定义的用户ID字段是
userID,但查询时错误使用了memberId,导致无法定位到目标用户,逻辑完全失效。 - 异步操作处理错误:
Balance.findOne()是异步Promise操作,直接用if(Balance.findOne(...))会把Promise对象判定为true,不会等待实际查询结果,导致后续逻辑全错。 - Unique约束不合理:单独给
userID设置unique: true,意味着同一个用户只能在一个服务器有记录,不符合多服务器经济系统的需求,还会导致新用户无法创建资料。
修复后的代码
消息处理逻辑
if (message.author.bot) return; const member = message.mentions.members.first(); if (member && message.content.match('!ponyo balance')) { console.log(`准备为用户 ${member.id} 执行 balance.createBalance()`); const profileBalance = await balance.createBalance(member); console.log(`查询到的余额资料:${JSON.stringify(profileBalance)}`); await message.reply(`${member.displayName} 有 ${profileBalance.coins} 个硬币!:D`); }
createBalance 函数
const Balance = require('./profileSchema'); const mongoose = require('mongoose'); async function createBalance(member) { // 匹配Schema字段,并用await等待查询结果 let balanceProfile = await Balance.findOne({ userID: member.id, serverID: member.guild.id }); if (balanceProfile) { return balanceProfile; } else { balanceProfile = new Balance({ userID: member.id, serverID: member.guild.id }); await balanceProfile.save().catch(err => console.error('保存用户资料失败:', err)); console.log(`已创建新用户资料:${balanceProfile.toString()}`); return balanceProfile; } } module.exports = { createBalance };
Mongoose Schema 定义
const mongoose = require('mongoose'); const profileSchema = new mongoose.Schema({ userID: { type: String, required: true }, serverID: { type: String, required: true }, coins: { type: Number, default: 100 }, bank: { type: Number, default: 0 } // 给bank设置默认值,避免undefined }); // 创建复合唯一索引,确保同一个用户在同一服务器仅存一条记录 profileSchema.index({ userID: 1, serverID: 1 }, { unique: true }); const model = mongoose.model('ProfileModels', profileSchema); module.exports = model;
内容的提问来源于stack exchange,提问作者rat
相关产品推荐
相关产品推荐

