使用dotenv和mongoose连接MongoDB时遇uri参数未定义错误
解决Mongoose连接MongoDB时的"uri参数为undefined"错误
问题描述
尝试用dotenv和mongoose连接Node.js到MongoDB时,持续报错:
The 'uri' parameter to 'openUri()' must be a string, got "undefined". Make sure the first parameter to 'mongoose.connect()' or 'mongoose.createConnection()' is a string.
错误捕获中console.log(process.env.MONGO_URI)输出undefined,但类型判断显示为string,以下是涉及的代码文件:
connect.js
const mongoose = require('mongoose') const connectDB = (url) => { return mongoose.connect(url, { useNewUrlParser: true, useCreateIndex: true, useFindAndModify: false, useUnifiedTopology:true }) } module.exports = connectDB
.env
MONGO_URI = 'mongodb+srv://anousheh1:xxxxxxx@cluster0.xqrivwh.mongodb.net/?retryWrites=true&w=majority'
app.js
const express = require('express') const app = express() const tasks = require('./routers/tasks') const connectDB = require('./db/connect') require('dotenv').config() const find = require('./routers/.env') // Middleware app.use(express.json()) app.use('/api/v1/tasks', tasks) app.get('/hello', (req, res) => { res.send('Task Manager App') }) const port = 3000 const start = async () => { try{ await connectDB(process.env.MONGO_URI) app.listen(port, console.log(`Server is listening on part ${port}`)) } catch (error) { console.log(process.env.MONGO_URI) console.log(typeof(MONGO_URI)) console.log(error.message) } } start()
问题分析与修复步骤
核心问题是process.env.MONGO_URI无法正确读取值,以下是具体错误点和修复方案:
1. 删除错误的.env文件引入
app.js中const find = require('./routers/.env')完全多余,且会干扰dotenv的正常加载,直接删除这行代码。
2. 修正.env文件的变量格式
.env文件中变量赋值不需要加单引号,且等号前后建议不要留空格,修改为:
MONGO_URI=mongodb+srv://anousheh1:xxxxxxx@cluster0.xqrivwh.mongodb.net/?retryWrites=true&w=majority
3. 修正类型判断代码
catch块中typeof(MONGO_URI)的写法错误,MONGO_URI不是全局变量,应改为:
console.log(typeof process.env.MONGO_URI)
4. 移除过时的Mongoose配置选项
Mongoose 6.x及以上版本已默认启用useNewUrlParser等选项,可简化connect.js代码:
const mongoose = require('mongoose') const connectDB = (url) => { return mongoose.connect(url) } module.exports = connectDB
修复后完整app.js代码
const express = require('express') const app = express() const tasks = require('./routers/tasks') const connectDB = require('./db/connect') require('dotenv').config() // Middleware app.use(express.json()) app.use('/api/v1/tasks', tasks) app.get('/hello', (req, res) => { res.send('Task Manager App') }) const port = 3000 const start = async () => { try{ await connectDB(process.env.MONGO_URI) app.listen(port, () => console.log(`Server is listening on port ${port}`)) } catch (error) { console.log('MONGO_URI:', process.env.MONGO_URI) console.log('MONGO_URI类型:', typeof process.env.MONGO_URI) console.log('错误信息:', error.message) } } start()
额外检查项
- 确保
.env文件放在项目根目录(与app.js同级),若不在根目录需给dotenv指定路径:require('dotenv').config({ path: './指定路径/.env' }) - 确认MongoDB Atlas连接字符串正确,密码无未编码的特殊字符,且已将你的IP加入Atlas白名单
- 确保安装了所有依赖:
npm install express mongoose dotenv
内容的提问来源于stack exchange,提问作者anousheh21
相关产品推荐
相关产品推荐

