抽离MongoDB连接为ES模块后导入出现模块未找到错误
问题解决:抽离MongoDB连接模块后出现模块找不到错误
原始可运行代码(index.js)
import express from 'express'; import mongoose from 'mongoose'; import dotenv from 'dotenv'; const app = express(); dotenv.config(); const DB = process.env.URI; const PORT = process.env.PORT; const connect = mongoose.connect(DB, { useNewUrlParser: true, useUnifiedTopology: true }).then(() => { console.log("Connection successful"); }).catch((err) => console.error("Connection failed", err)); app.listen(PORT, () => { console.log(`Server running on port: ${PORT}`); });
抽离后的conn.js代码
import mongoose from 'mongoose'; const DB = process.env.URI; console.log('DB:', process.env.URI); const connect = mongoose.connect(DB, { useNewUrlParser: true, useUnifiedTopology: true }).then(() => { console.log("Connection successful"); }).catch((err) => console.error("Connection failed", err)); export default connect;
抽离后的index.js代码
import express from 'express'; import mongoose from 'mongoose'; import dotenv from 'dotenv'; const app = express(); dotenv.config(); const PORT = process.env.PORT const DB = process.env.URI; import connect from "./db/conn" app.listen(PORT, () => { console.log(`Server running on port: ${PORT}`); });
报错信息
node:internal/process/esm_loader:40 internalBinding('errors').triggerUncaughtException( ^ Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/kshitijgupta/WEB D/mern-estate/server/db/conn' imported from /Users/kshitijgupta/WEB D/mern-estate/server/index.js Did you mean to import ../db/conn.js? at new NodeError (node:internal/errors:406:5) at finalizeResolution (node:internal/modules/esm/resolve:233:11) at moduleResolve (node:internal/modules/esm/resolve:845:10) at defaultResolve (node:internal/modules/esm/resolve:1043:11) at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:383:12) at ModuleLoader.resolve (node:internal/modules/esm/loader:352:25) at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:228:38) at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:85:39) at link (node:internal/modules/esm/module_job:84:36) { url: 'file:///Users/kshitijgupta/WEB%20D/mern-estate/server/db/conn', code: 'ERR_MODULE_NOT_FOUND' }
目录结构
server目录下包含:
- index.js
- db文件夹,其中包含conn.js
解决方案
1. 修复模块导入路径
在ESM规范中,导入本地文件必须指定完整的文件后缀名。修改index.js中的导入语句:
// 原写法 import connect from "./db/conn" // 修改为 import connect from "./db/conn.js"
2. 调整import语句到模块顶层
ESM要求所有import语句必须放在模块最顶层,不能在变量声明或业务代码之后。调整index.js代码结构:
import express from 'express'; import mongoose from 'mongoose'; import dotenv from 'dotenv'; import connect from "./db/conn.js"; // 移至顶层 const app = express(); dotenv.config(); const PORT = process.env.PORT; const DB = process.env.URI; app.listen(PORT, () => { console.log(`Server running on port: ${PORT}`); });
3. 修复conn.js的环境变量读取问题
conn.js未加载dotenv,直接调用process.env.URI会无法获取环境变量值,需在conn.js中添加dotenv配置:
import mongoose from 'mongoose'; import dotenv from 'dotenv'; dotenv.config(); // 添加该行 const DB = process.env.URI; console.log('DB:', process.env.URI); const connect = mongoose.connect(DB, { useNewUrlParser: true, useUnifiedTopology: true }).then(() => { console.log("Connection successful"); }).catch((err) => console.error("Connection failed", err)); export default connect;
完成以上修改后,即可正常导入conn模块并成功连接MongoDB。
内容的提问来源于stack exchange,提问作者Kshitij Gupta
相关产品推荐
相关产品推荐

