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
相关产品推荐
相关产品推荐

