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

抽离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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:30:59