Node.js中require报错:无法找到模块'.../models/user'
这个问题我太熟了!本质是文件移动后相对路径的基准目录变了,咱们一步步拆解问题、解决问题:
先搞清楚路径为什么错了
先还原下你的项目结构变化:
拆分前的结构(正常运行时):
项目根目录/ ├── models/ │ └── user.js └── router/ └── users.js当时
users.js里的require('../models/user')是从router/目录往上跳一级到项目根,再进入models找到user.js,完全没问题。拆分后的结构(报错时):
项目根目录/ ├── models/ │ └── user.js └── router/ └── users/ ├── login.js └── register.js现在你的
login.js在router/users/目录下,再用../models/user的话,Node会从router/users/往上跳一级到router/,然后找models/user——可router/下面根本没有models文件夹,自然就报找不到模块的错了!
三种解决方案,按需选择
方案1:修正相对路径(最简单,适合小型项目)
既然现在文件多嵌套了一层,那相对路径就要多往上跳一级:
把login.js、register.js里的路径改成:
const User = require('../../models/user');
解释:../../会从router/users/先跳到router/,再跳到项目根目录,之后就能正确找到models/user.js了。
方案2:用绝对路径(最稳妥,避免后续改结构再踩坑)
相对路径很容易因为文件移动出问题,用绝对路径一劳永逸:
方式A:借助__dirname和path模块
先引入Node内置的path模块,再用path.join拼接绝对路径:
const path = require('path'); const User = require(path.join(__dirname, '../../models/user'));
你可以先打印__dirname看看当前文件的绝对路径,方便排查:
console.log(__dirname); // 输出示例:/你的电脑路径/项目根目录/router/users
方式B:配置NODE_PATH环境变量
如果是大型项目,不想写长长的路径,可以把项目根目录设为Node的模块查找路径:
- Mac/Linux终端运行:
export NODE_PATH=./ - Windows命令行运行:
set NODE_PATH=./
之后所有文件里都可以直接写:
const User = require('models/user');
Node会自动从项目根目录开始查找模块。
方案3:用模块别名(适合复杂项目)
如果你的项目用了Webpack或者Babel,可以配置模块别名,比如把@models映射到./models目录,这样不管文件在哪,都可以写require('@models/user')。不过纯Node项目的话,前两种方案更直接。
内容的提问来源于stack exchange,提问作者Luke

