Ubuntu环境Docker部署Node.js站点找不到UserRepository模块如何解决
问题根因
该Cannot find module报错为Node.js运行时无法匹配到代码中引用的相对路径模块,和npm依赖、系统基础包无关,因此执行npm install、apt-get update无法解决问题。本地运行正常、Docker容器内报错的核心原因是两类环境的文件系统规则、文件加载逻辑存在差异。
排查与解决步骤
- 大小写不匹配问题
Windows、macOS默认采用大小写不敏感的文件系统,Ubuntu及Docker内的Linux环境均为大小写敏感。请核对../repositories/目录下的实际文件名,是否与代码中引用的UserRepository大小写完全一致,比如实际文件名为userRepository.js、Userrepository.js都会导致容器内加载失败,将代码中的引用路径修改为和实际文件名完全匹配即可。 - Docker文件遗漏问题
先检查项目根目录下的.dockerignore配置,确认未将repositories/目录或.js后缀的源码文件纳入忽略规则;再检查Dockerfile中的COPY指令,确认除package.json外,已将全部项目源码复制到镜像的对应工作目录下。如果是使用挂载卷启动容器,需确认本地挂载路径和容器内目标路径对应正确,未出现挂载错位导致/app/usr/src/repositories/目录在容器内不存在的情况。 - 路径定位校验
可在user.services.js文件顶部添加临时调试代码,确认路径下的文件列表:
重新构建镜像启动后查看容器日志,即可明确目标路径下是否存在对应文件。const fs = require('fs') const path = require('path') console.log('当前文件目录', __dirname) console.log('目标目录文件列表', fs.readdirSync(path.join(__dirname, '../repositories')))
原始报错日志
internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module '../repositories/UserRepository' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15) at Function.Module._load (internal/modules/cjs/loader.js:562:25) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at Object.<anonymous> (/app/usr/src/services/user.services.js:2:24) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3) [nodemon] app crashed - waiting for file changes before starting.
内容的提问来源于stack exchange,提问作者Divya rani
相关产品推荐
相关产品推荐

