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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:57:20