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

Node.js中require与import混用报错及db.js导入失败问题求助

问题:CommonJS与ES模块混合导入错误

原server.js代码

const express = require('express');
const connectDB = require('./config/db');
const path = require('path');

const app = express();

// Connect Database
connectDB();

// Init Middleware
app.use(express.json());

// Define Routes
app.use('/api/users', require('./routes/api/users'));

运行时错误信息

node:internal/errors:490
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_REQUIRE_ESM]: require() of ES Module E:\Study\DEC\devconnector_mobang\config\db.js from E:\Study\DEC\devconnector_mobang\index.js not supported.
Instead change the require of db.js in E:\Study\DEC\devconnector_mobang\index.js to a dynamic import() which is available in all CommonJS modules.

尝试的解决方案及问题

尝试转为ES模块语法并保留CommonJS的require能力,但import connectDB from "./config/db.js";无法正常加载(加载JSON文件./config/default.json则正常):

import express from "express";
import connectDB from "./config/db.js";
import path from "path";

// Define require
import { createRequire } from "module";
const require = createRequire(import.meta.url);

const app = express();

// Connect Database
connectDB();

// Init Middleware
app.use(express.json());

const user = require("./config/default");

app.use("/api/users", user);

解决方法

方法1:统一转为ES模块(推荐)

  • 在项目根目录的package.json中添加"type": "module",所有.js文件默认按ES模块处理
  • 替换所有require为ES模块语法:
    • 路由模块:import usersRoute from "./routes/api/users.js";,然后app.use("/api/users", usersRoute);
    • JSON文件:Node.js 17.1+可直接用import defaultConfig from "./config/default.json" assert { type: "json" };,或用createRequire加载:
      import { createRequire } from "module";
      const require = createRequire(import.meta.url);
      const defaultConfig = require("./config/default.json");
      
  • 确保db.js的导出正确:如果是ES模块用export default connectDB,如果是CommonJS用module.exports = connectDB,ES模块可兼容导入CommonJS模块

方法2:在CommonJS中动态导入ES模块

保留原文件为CommonJS(不添加"type": "module"),用异步动态导入加载ES模块db.js:

const express = require('express');
const path = require('path');

const app = express();

// 用async函数包裹初始化逻辑
async function startServer() {
  // 动态导入ES模块
  const { default: connectDB } = await import('./config/db.js');
  await connectDB();

  app.use(express.json());
  app.use('/api/users', require('./routes/api/users'));

  const PORT = process.env.PORT || 5000;
  app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
}

startServer();

排查db.js导入失败的关键点

  • 确认db.js路径正确,ES模块导入必须带完整扩展名(.js)
  • 检查db.js内部是否有语法错误,导致模块加载失败
  • 验证db.js的导出语句是否正确,确保有可被导入的default导出

内容的提问来源于stack exchange,提问作者Au Wai Lun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:41:21