使用Render部署FastAPI时无法连接MongoDB的求助
部署FastAPI到Render时MongoDB连接失败的解决方案
问题概述
- 本地终端运行FastAPI项目,发送POST请求可正常连接MongoDB
- 部署到Render后,POST请求触发数据库连接失败,错误信息如下:
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms), Timeout: 30s, Topology Description: <TopologyDescription id: 673d3b500f19ce930ab7ddcf, topology_type: Unknown, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')>]>
- 当前启动命令:
uvicorn main:app --reload --host 0.0.0.0 --port $PORT
原因分析
错误日志显示程序尝试连接localhost:27017,说明部署后的代码未正确配置MongoDB远程连接地址,大概率是代码中硬编码的URI占位符未替换,或环境变量未正确设置。
解决方案
1. 替换硬编码的MongoDB URI
检查代码中的MongoDB连接部分,确保将占位符<my_mongoDB_uri>替换为实际的远程MongoDB连接字符串(例如MongoDB Atlas提供的完整URI,包含用户名、密码、集群地址):
# 替换后(示例) mongodb_uri = 'mongodb+srv://<username>:<password>@cluster0.mongodb.net/?retryWrites=true&w=majority' client = AsyncIOMotorClient(mongodb_uri) database = client["Cluster"] users = database["Collection"]
注意:删除URI中的<>符号,填入真实的用户名和密码。
2. 使用环境变量存储敏感信息(推荐)
为避免硬编码敏感信息,改用环境变量读取URI:
- 修改代码:
import os from motor.motor_asyncio import AsyncIOMotorClient # 读取环境变量 mongodb_uri = os.getenv("MONGODB_URI") if not mongodb_uri: raise ValueError("必须设置MONGODB_URI环境变量") client = AsyncIOMotorClient(mongodb_uri) database = client["Cluster"] users = database["Collection"]
- 在Render项目控制台中,进入「Environment」选项卡,添加环境变量
MONGODB_URI,值为你的MongoDB连接字符串。
3. 验证MongoDB网络权限
- 若使用MongoDB Atlas,进入Atlas控制台,确保Render的服务器IP已添加到IP白名单(或临时设置为允许所有IP
0.0.0.0/0用于测试)。 - 确认MongoDB集群状态正常,无停机或维护情况。
4. 优化启动命令
生产环境部署时,移除开发模式的--reload参数,避免资源浪费:
uvicorn main:app --host 0.0.0.0 --port $PORT
内容的提问来源于stack exchange,提问作者Andrei Mendez
相关产品推荐
相关产品推荐

