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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:03:13