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

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;

问题根源

  1. 字段名不匹配:Schema 中定义的用户ID字段是userID,但查询时错误使用了memberId,导致无法定位到目标用户,逻辑完全失效。
  2. 异步操作处理错误:Balance.findOne()是异步Promise操作,直接用if(Balance.findOne(...))会把Promise对象判定为true,不会等待实际查询结果,导致后续逻辑全错。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:01:15