MongooseError求助:联合前端启动时process.env.MONGODB_URI未定义
解决MongooseError:openUri()的uri参数为undefined问题
问题情况
用concurrently同时启动前后端时,后端的process.env.MONGODB_URI变成了undefined,触发Mongoose的错误提示:openUri()的uri参数必须是字符串,但获取到了"undefined"。单独运行后端一切正常,.env文件里也已配置好MONGODB_URI和PORT。
后端Index.js代码:
import express from "express"; import bodyParser from "body-parser"; import mongoose from "mongoose"; import dotenv from "dotenv"; import cors from "cors"; //routes import postRoutes from "./routes/posts.js"; import userRoutes from "./routes/user.js"; //call dotenv dotenv.config(); //initialize this app const app = express(); //set up body parser app.use(bodyParser.json({ limit: "30mb", extended: true })); app.use(bodyParser.urlencoded({ limit: "30mb", extended: true })); //must be above the routes app.use(cors()); //use middleware for the prefix routes the posts routes will be reached by localhost:3001/posts/ .... app.use("/posts", postRoutes); app.use("/user", userRoutes); //host data base through the cloud const PORT = process.env.PORT || 3001; mongoose .connect( process.env.MONGODB_URI ) .then(() => app.listen(PORT, () => console.log(`server is running on port: ${PORT}`)) ) .catch((error) => console.log(error));
.env文件内容:
PORT=3001 MONGODB_URI=<mongodb-atlas-string>
问题根源
concurrently启动时,后端的工作目录可能不对。默认dotenv.config()会从当前执行命令的目录加载.env文件,如果启动命令是在项目根目录执行,而.env文件放在后端子目录里,dotenv就找不到它,自然读不到环境变量。
解决办法
办法1:给dotenv指定.env文件路径
修改后端Index.js里的dotenv.config(),明确写出.env的路径:
// 如果.env和Index.js在同一个文件夹,用这个路径 dotenv.config({ path: "./.env" }); // 若后端代码在backend文件夹,根目录启动的话,路径改成../.env // dotenv.config({ path: "../.env" });
办法2:调整concurrently的启动命令
让后端启动时切换到它所在的目录。比如项目结构是根目录下有backend和frontend两个文件夹,package.json里的scripts改成这样:
"scripts": { "start": "concurrently \"cd backend && npm start\" \"cd frontend && npm start\"" }
这样后端启动时会在backend目录下执行,dotenv能直接找到同目录的.env文件。
办法3:把.env移到项目根目录
如果前后端有共享的环境变量,直接把.env放到项目根目录,然后后端的dotenv.config()可以保持默认,或者指定根目录路径:
dotenv.config({ path: "../.env" });
验证方式
在后端代码里加一行日志,确认环境变量是否加载成功:
console.log("MONGODB_URI:", process.env.MONGODB_URI);
启动项目后如果能输出你配置的MongoDB链接字符串,就说明问题解决了。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

