Express Node.js使用Mongoose连接MongoDB时uri为undefined报错如何解决
问题原因与解决方案
核心报错原因
错误日志明确显示mongoose.connect接收的uri参数为undefined,是配置不匹配问题导致的:
- 环境变量名不一致:
config.env中定义的Mongo连接地址变量为MONGO_URL,但connection.js中读取的是process.env.MONGO_URI,二者命名不统一导致读取不到值 - dotenv加载逻辑冗余:app.js中两次调用
dotenv.config(),第一次默认读取根目录.env文件,第二次才指定加载config.env,如果配置全放在config.env中可以删除第一次无参数的调用
分步修复方案
- 统一环境变量命名
二选一修改即可:
- 修改
config.env中的变量名:将MONGO_URL=....改为MONGO_URI=你的MongoDB连接地址 - 或修改
connection.js中的读取逻辑:将mongoose.connect(process.env.MONGO_URI, ...)改为mongoose.connect(process.env.MONGO_URL, ...)
确认config.env路径正确性
确保config.env文件存放在项目根目录,和app.js同级,如果放在其他目录,需要在dotenv.config({path: 'xxx/config.env'})中填写正确的相对路径。(可选优化)调整服务启动逻辑
connectDB是异步函数,建议等待数据库连接成功后再启动服务,避免服务启动后数据库未就绪的异常,修改app.js代码如下:
// 把dotenv加载放到最顶部 const dotenv = require('dotenv'); dotenv.config({ path: 'config.env' }); const express = require('express'); const morgan = require('morgan'); const app = express(); const path = require('path'); const bodyparser = require('body-parser'); const connectDB = require('./server/database/connection'); const PORT = process.env.PORT || 8080 app.enable('case sensitive routing'); app.enable('etag'); app.set('env', 'development'); app.use(morgan('tiny')); // 连接成功后再启动服务 connectDB().then(() => { app.listen(PORT, function() { console.log(`server is running on http://localhost:${PORT}`); }); })
- (可选优化)删除废弃配置
如果你使用的是Mongoose 6.x及以上版本,useNewUrlParser、useUnifiedTopology、useFindAndModify、useCreateIndex这几个参数已经默认启用,不需要手动传入,可以直接删除,避免不必要的警告。
内容的提问来源于stack exchange,提问作者Hesham Eldawy
相关产品推荐
相关产品推荐

