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

Discord多服务器机器人添加用户至JSON数据库触发KeyError问题

Discord机器人经济模块用户添加功能修复

问题描述

执行添加用户至JSON数据库的命令时触发KeyError: '988839445392408616',数据库仅包含提问者本人信息,添加其他用户失败。

原命令代码

async def add(ctx, mem: discord.Member):
     
     with open("servers.json", "r") as f:
          
          data = json.load(f)
          lang = data[str(ctx.message.guild.id)]['oth']['lang']
          users = data[str(ctx.message.guild.id)]['eco']['users']
          userid = data[str(ctx.message.guild.id)]['eco']['users'][str(mem.id)]

     if str(ctx.message.guild.id) in data:
          if lang == 'ru':

               data[str(ctx.message.guild.id)]['eco']['users'].append({str(mem.id):{}})
               with open("servers.json", "w") as f:
                    json.dump(data, f, sort_keys=True, indent=4)

               await ctx.send('Success')
          else:
               await ctx.send('Language error')
     else:
          await ctx.send('This server is not in the database')

JSON数据库结构

{
    "988095856215461928": {
        "cd": {
            "ban": 60,
            "casino": 10,
            "fifty": 10,
            "mute": 10,
            "rob": 3600,
            "unban": 60,
            "unmute": 10,
            "unwarn": 10,
            "warn": 10,
            "work": 3600
        },
        "eco": {
            "eco_emoji": ":coin:",
            "shop": {
                "id": {
                    "cost": 100,
                    "name": "",
                    "role_id": ""
                }
            },
            "users": {
                "459007192276795393": {
                    "bank": 0,
                    "inv": {},
                    "money": 0
                }
            }
        },
        "oth": {
            "lang": "ru"
        },
        "pay": {
            "eco1": "false",
            "eco2": "false",
            "extra": "false",
            "logs": "false"
        },
        "roles": {
            "muterole": "None"
        }
    }
}

错误信息

Command raised an exception: KeyError: '988839445392408616'

解决方案

错误原因分析

  1. 提前访问不存在的用户键:代码中userid = data[str(ctx.message.guild.id)]['eco']['users'][str(mem.id)]直接尝试获取未存入数据库的用户ID,触发KeyError。
  2. 错误操作数据结构:users是字典类型,却调用列表的append方法,导致数据结构混乱,无法正确添加用户。
  3. 逻辑顺序倒置:先读取服务器内部数据,再判断服务器是否存在,若服务器不在数据库中,提前读取的代码会直接报错。

修正后的命令代码

async def add(ctx, mem: discord.Member):
    guild_id = str(ctx.message.guild.id)
    user_id = str(mem.id)
    
    # 读取数据库
    with open("servers.json", "r") as f:
        data = json.load(f)
    
    # 先检查服务器是否存在
    if guild_id not in data:
        await ctx.send('This server is not in the database')
        return
    
    guild_data = data[guild_id]
    lang = guild_data['oth']['lang']
    users = guild_data['eco']['users']
    
    # 检查语言是否符合要求
    if lang != 'ru':
        await ctx.send('Language error')
        return
    
    # 避免重复添加用户
    if user_id in users:
        await ctx.send('User already exists in the database')
        return
    
    # 添加用户并初始化经济数据(与已有用户结构保持一致)
    users[user_id] = {
        "bank": 0,
        "inv": {},
        "money": 0
    }
    
    # 将修改写入数据库
    with open("servers.json", "w") as f:
        json.dump(data, f, sort_keys=True, indent=4)
    
    await ctx.send('Success')

代码说明

  • 调整逻辑顺序:先判断服务器是否存在,再读取内部数据,避免无意义报错。
  • 移除访问不存在用户ID的代码,改为先检查用户是否已存在。
  • 使用字典赋值方式添加用户,符合JSON中users的字典结构。
  • 初始化用户经济数据,保持与已有用户结构一致,避免后续功能异常。
  • 增加重复添加判断,防止冗余数据写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:55:21