使用discord.py+MongoDB实现警告查询命令时遇TypeError错误求助
问题分析与解决
错误原因
- Cursor对象无法直接索引:MongoDB的
find()返回的是游标(Cursor)对象,不是单个文档,直接用check['reason']会触发TypeError,因为游标不支持这种索引方式。 - 错误的空值判断:游标对象永远不会是
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
相关产品推荐
相关产品推荐

