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

FastAPI新增MongoDB查询路由后出现TypeError问题求助

FastAPI+MongoDB公司管理接口TypeError错误修复

问题根源

  1. 路由冲突:你定义的@app.get('/{name}')和@app.get('/{field}')路径结构完全一致,FastAPI会优先匹配先定义的/{name}路由。当你请求按领域查询时,实际触发的是按名称查询的逻辑,用领域值去匹配name字段,自然查不到数据,返回None。
  2. 空值未处理: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:58:31