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

使用discord.py+MongoDB实现警告查询命令时遇TypeError错误求助

问题分析与解决

错误原因

  1. Cursor对象无法直接索引:MongoDB的find()返回的是游标(Cursor)对象,不是单个文档,直接用check['reason']会触发TypeError,因为游标不支持这种索引方式。
  2. 错误的空值判断:游标对象永远不会是None,哪怕没有匹配的文档,返回的也是空游标,所以if check is None永远不会触发。

修复后的代码

@client.hybrid_command(name="warnings", with_app_command=True, description="查看成员的警告记录", aliases=["punishments"])
@commands.is_owner()
async def warnings(ctx, member: discord.Member = None):
    if member is None:
        await ctx.reply("需要指定一名成员")
        return
    
    # 将游标转为列表,获取该用户的所有警告记录
    warns = list(warndb.warn_logs.find({"user_id": member.id}))
    
    if not warns:
        await ctx.reply("该用户没有任何警告记录")
        return
    
    embed = discord.Embed(color=embedcolor, title=f"{member.name} 的警告记录")
    # 遍历所有警告记录,逐个添加到Embed字段
    for idx, warn in enumerate(warns, start=1):
        # 假设每条记录包含reason(警告原因)、moderator_id(处理人ID)
        reason = warn.get("reason", "无原因描述")
        moderator = ctx.guild.get_member(warn["moderator_id"]) or f"<@{warn['moderator_id']}>"
        # 可根据实际存储的字段调整展示内容
        embed.add_field(
            name=f"警告 #{idx}",
            value=f"**原因**: {reason}\n**处理人**: {moderator}",
            inline=False
        )
    
    await ctx.send(embed=embed)

关键修改点

  • 用list()把游标转为列表,方便遍历所有警告记录
  • 用if not warns:判断用户是否有警告
  • 遍历警告列表,为每条记录生成独立的Embed字段,展示完整警告信息
  • 增加warn.get("reason", "无原因描述")处理字段缺失的情况,避免报错
  • 优化处理人显示逻辑:优先显示成员昵称,无法获取时显示ID提及

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:40:37