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'
解决方案
错误原因分析
- 提前访问不存在的用户键:代码中
userid = data[str(ctx.message.guild.id)]['eco']['users'][str(mem.id)]直接尝试获取未存入数据库的用户ID,触发KeyError。 - 错误操作数据结构:
users是字典类型,却调用列表的append方法,导致数据结构混乱,无法正确添加用户。 - 逻辑顺序倒置:先读取服务器内部数据,再判断服务器是否存在,若服务器不在数据库中,提前读取的代码会直接报错。
修正后的命令代码
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
相关产品推荐
相关产品推荐

