FastAPI新增MongoDB查询路由后出现TypeError问题求助
FastAPI+MongoDB公司管理接口TypeError错误修复
问题根源
- 路由冲突:你定义的
@app.get('/{name}')和@app.get('/{field}')路径结构完全一致,FastAPI会优先匹配先定义的/{name}路由。当你请求按领域查询时,实际触发的是按名称查询的逻辑,用领域值去匹配name字段,自然查不到数据,返回None。 - 空值未处理:
company_dict函数直接访问company["_id"],但当find_one返回None时,就会触发TypeError: 'NoneType' object is not subscriptable。
修复步骤
1. 区分路由路径
给两个参数化路由加上不同前缀,让FastAPI能正确识别接口意图:
- 按名称查询:改为
/company/{name} - 按领域查询:改为
/field/{field}
2. 处理空查询结果
在转换函数和查询接口中增加空值判断,避免直接操作None,同时返回友好提示。
修复后完整代码
from pymongo import MongoClient from fastapi import FastAPI, HTTPException from pydantic import BaseModel from bson import ObjectId # MongoDB连接配置 username = "root" password = "root" client = MongoClient(f"mongodb://{username}:{password}@localhost:27017") db = client.companies companies = db.companies # Pydantic模型定义 class Company(BaseModel): name: str field: str manager: str phone: str # 转换MongoDB文档为API返回格式 def company_dict(company) -> dict: if not company: return {"message": "未找到对应公司"} return { "id": str(company["_id"]), "name": company["name"], "field": company["field"], "manager": company["manager"], "phone": company["phone"] } # 转换文档列表为API返回格式 def list_of_companies(companies_cursor): return [company_dict(company) for company in companies_cursor] app = FastAPI() # 新增公司接口 @app.post('/') def post_companies(company: Company): companies.insert_one(dict(company)) return {"message": "公司添加成功"} # 查询全部公司接口 @app.get('/') def get_companies(): return list_of_companies(companies.find()) # 按名称查询单个公司接口 @app.get('/company/{name}') def get_a_company(name: str): company = companies.find_one({"name": name}) if not company: raise HTTPException(status_code=404, detail="未找到该名称的公司") return company_dict(company) # 按领域查询公司接口 @app.get('/field/{field}') def get_all_companies_of_a_field(field: str): company_list = list(companies.find({"field": field})) if not company_list: return {"message": "未找到该领域的公司"} return list_of_companies(company_list)
额外说明
- 用
HTTPException返回404状态码是REST API规范做法,前端能更准确处理异常情况 - 简化了领域查询的条件写法,
{"field": field}和{"field": {"$eq": field}}效果完全一致 - 新增了接口返回的提示信息,让交互更友好
内容的提问来源于stack exchange,提问作者Mikey
相关产品推荐
相关产品推荐

