从MongoDB获取数据时出现TypeError: 'NoneType'不可下标问题排查
Discord机器人balance命令报错修复
问题根源
你遇到的TypeError是因为当MongoDB中没有查询到对应用户的数据时,client.eco.find(ctx.author.id)返回了None,后续代码尝试用data["balance"]访问None的下标,直接触发错误。另外你的代码没有实现「先检查用户数据是否存在」的逻辑,反而先判断了服务器管理权限,逻辑顺序有误。
修复步骤及代码
核心修改点
- 先检查查询结果
data是否为空,为空则初始化用户余额数据 - 确保访问
data["balance"]前,data是有效的字典对象 - 修正MongoDB查询方法:如果
client.eco是集合对象,应该用find_one而非find(find返回游标,find_one才会返回单个文档)
修正后的代码
@client.command(aliases=['bal']) async def balance(ctx): # 用find_one查询单个用户文档,参数为查询条件字典 data = await client.eco.find_one({"_id": ctx.author.id}) # 处理用户数据不存在的情况:初始化余额为0 if not data: await client.eco.insert_one({"_id": ctx.author.id, "balance": 0}) data = {"balance": 0} # 判断用户权限并发送余额 if ctx.author.guild_permissions.manage_guild: bal = data["balance"] # 确保余额转为字符串,避免Embed描述字段报错 e = discord.Embed(title=f"{ctx.author.name}'s Balance", description=str(bal), color=ctx.author.color) # 处理头像为空的情况 avatar_url = ctx.author.avatar.url if ctx.author.avatar else ctx.author.default_avatar.url e.set_thumbnail(url=avatar_url) await ctx.send(embed=e) else: await ctx.send("无权限查看余额!")
关键说明
- 若你原本的
client.eco.find()是自定义方法,请确认它在未找到数据时的返回值,确保能正确判断用户数据是否存在 - 初始化余额的数值可根据你的需求调整,比如改成100作为初始资金
内容的提问来源于stack exchange,提问作者Saptanshu
相关产品推荐
相关产品推荐

