Node.js ESM导入Mongoose模型报ERR_MODULE_NOT_FOUND如何解决
ES Module模式下导入Mongoose模型触发ERR_MODULE_NOT_FOUND报错排查
问题复现
编写完User Mongoose模型后,使用ES Module语法在路由文件中导入,启动Node.js项目时抛出模块找不到错误。
相关代码
User模型定义(models/User.js):
import mongoose from "mongoose"; let UserSchema = new mongoose.Schema({ email: { type: String, required: true }, password: { type: String, required: true }, enabled: { type: Boolean } }, { collection: 'Users' }); const User = mongoose.model('User', UserSchema) export default User
路由文件导入语句(routes/account.js):
import User from "../models/User";
报错信息
node:internal/errors:464 ErrorCaptureStackTrace(err); ^ Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:\repos\Web\MyApp\backend\models\User' imported from C:\repos\Web\MyApp\backend\routes\account.js at new NodeError (node:internal/errors:371:5) at finalizeResolution (node:internal/modules/esm/resolve:418:11) at moduleResolve (node:internal/modules/esm/resolve:981:10) at defaultResolve (node:internal/modules/esm/resolve:1078:11) at ESMLoader.resolve (node:internal/modules/esm/loader:530:30) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:251:18) at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:79:40) at link (node:internal/modules/esm/module_job:78:36) { code: 'ERR_MODULE_NOT_FOUND' } Program node index.js exited with code 1
项目基础信息
目录结构参考:
package.json配置:
{ "name": "MyApp", "version": "1.0.0", "description": "", "main": "index.js", "type": "module", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "supervisor index.js" }, "author": "", "license": "ISC", "dependencies": { "axios": "^0.27.2", "bcryptjs": "^2.4.3", "body-parser": "^1.20.0", "cors": "^2.8.5", "crypto": "^1.0.1", "crypto-js": "^4.1.1", "crypto.js": "^3.0.0", "dotenv": "^16.0.1", "express": "^4.18.1", "http-errors": "^2.0.0", "jsonwebtoken": "^8.5.1", "moment": "^2.29.3", "mongoose": "^6.4.0", "supervisor": "^0.12.0" } }
故障原因
Mongoose模型的Schema定义、模型注册、默认导出逻辑均无错误,报错由Node.js原生ES Module的路径解析规则导致:
项目package.json中配置"type": "module"后,Node会启用原生ESM模块规范,该规范与CommonJS的解析逻辑存在明确差异:
- 原生ESM导入本地模块时,必须写全完整文件后缀,不支持CommonJS下默认省略
.js后缀的写法 - 原生ESM不会自动将目录下的
index.js识别为目录入口
当前导入路径写为../models/User时,Node会直接查找路径对应位置名为User的无后缀文件,不会自动补全.js后缀匹配User.js文件,因此抛出模块不存在的错误。
修复方案
补全导入路径的文件后缀即可解决问题,将routes/account.js中的导入语句修改为:
import User from "../models/User.js";
修改后重启服务即可正常加载Mongoose模型。
如果需要保留省略后缀的导入写法,需额外引入构建工具或自定义ESM loader实现路径自动补全,纯Node.js后端场景下直接写全文件后缀是官方推荐的零依赖方案,稳定性最高。
内容的提问来源于stack exchange,提问作者markzzz
相关产品推荐
相关产品推荐

