首页 > 解决方案 > 使用 fastAPI 从 MongoDb 获取数据时出错

问题描述

此功能是从 mongoDB 数据库中获取所有待办事项,但是当我尝试时显示错误。当从 mongo shell 尝试 find() 函数时,一切都很好,但是从这里它显示协程对象不可迭代的错误并显示类型错误。任何帮助都是可观的!

数据库连接

client = motor.motor_asyncio.AsyncIOMotorClient('mongodb://localhost:27017')

database = client.TodoList
Collection = database.todo

Python 函数

async def fetch_all_todos():
    todos = []
    cursor = Collection.find({})
    async for document in cursor:
        todos.append(ToDo(**document))
    return todos
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 369, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 59, in __call__
    return await self.app(scope, receive, send)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\fastapi\applications.py", line 199, in __call__      
    await super().__call__(scope, receive, send)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\applications.py", line 112, in __call__    
    await self.middleware_stack(scope, receive, send)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
    raise exc from None
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\exceptions.py", line 82, in __call__       
    raise exc from None
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\exceptions.py", line 71, in __call__       
    await self.app(scope, receive, sender)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\routing.py", line 580, in __call__
    await route.handle(scope, receive, send)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\routing.py", line 241, in handle
    await self.app(scope, receive, send)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\starlette\routing.py", line 52, in app
    response = await func(request)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\fastapi\routing.py", line 224, in app
    response_data = await serialize_response(
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\fastapi\routing.py", line 138, in serialize_response 
    return jsonable_encoder(response_content)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\site-packages\fastapi\encoders.py", line 141, in jsonable_encoder  
    raise ValueError(errors)
ValueError: [TypeError("'coroutine' object is not iterable"), TypeError('vars() argument must have __dict__ attribute')]

标签: pythonpython-3.xmongodbapifastapi

解决方案


您需要等待 mongo 呼叫

async def fetch_all_todos():
    todos = []
    cursor = await Collection.find({})
    async for document in cursor:
        todos.append(ToDo(**document))
    return todos

推荐阅读