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

从MongoDB获取数据时出现TypeError: 'NoneType'不可下标问题排查

Discord机器人balance命令报错修复

问题根源

你遇到的TypeError是因为当MongoDB中没有查询到对应用户的数据时,client.eco.find(ctx.author.id)返回了None,后续代码尝试用data["balance"]访问None的下标,直接触发错误。另外你的代码没有实现「先检查用户数据是否存在」的逻辑,反而先判断了服务器管理权限,逻辑顺序有误。

修复步骤及代码

核心修改点

  1. 先检查查询结果data是否为空,为空则初始化用户余额数据
  2. 确保访问data["balance"]前,data是有效的字典对象
  3. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:11:03