node.js - 从Docker运行时的NodeJS App 'Module Not Found'

标签 node.js docker express

我目前正在容器化我的应用程序。该应用程序的一部分是NodeJS Express后端。
当我使用node index.jsnodemon index.js在控制台上运行它时,它没有任何问题。
enter image description here
middlewares/index.js内部,我确实通过authJwt.jsverifySignup.js导入require('./verifySignup)require('./authJwt)
当我从控制台运行我的应用程序时,这毫不奇怪地很好。但是,如果我使用以下Dockerfile代码构建我的docker-image:

# build environment
FROM node:14

# Working Directoy
WORKDIR /app

ENV FILE_UPLOADS="./files/uploads"
ENV FILE_UPLOADS_PART="./files/uploads_part"
ENV PORT=3001
ENV DB_HOST="localhost"
ENV DB_USER="root"
ENV DB_PASSDWORD="root_password"
ENV DB_NAME="upload_db"
ENV SECRET_KEY="bezkoder-secret-key"

# Copy Needed Files for Dependencies
COPY package.json /app/package.json
COPY yarn.lock /app/yarn.lock

# Install with YARN
RUN yarn install

# Copy Source Files
COPY ./ /app

EXPOSE 3001

CMD [ "yarn", "start" ]
当我运行图像时,它立即终止。查看日志,发现以下错误:
$ docker logs 031241ce227a
yarn run v1.22.5
$ node index.js
internal/modules/cjs/loader.js:895
  throw err;
  ^

Error: Cannot find module './verifySignUp'
Require stack:
- /app/middleware/middleware.js
- /app/routes/auth.routes.js
- /app/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:892:15)
    at Function.Module._load (internal/modules/cjs/loader.js:742:27)
    at Module.require (internal/modules/cjs/loader.js:964:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (/app/middleware/middleware.js:2:22)
    at Module._compile (internal/modules/cjs/loader.js:1075:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1096:10)
    at Module.load (internal/modules/cjs/loader.js:940:32)
    at Function.Module._load (internal/modules/cjs/loader.js:781:14)
    at Module.require (internal/modules/cjs/loader.js:964:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/app/middleware/middleware.js',
    '/app/routes/auth.routes.js',
    '/app/index.js'
  ]
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
然后,我使用docker export adoring_kowalevski > contents.tar导出了docker-image,以查看图像中的文件系统,但是一切都在应有的位置。
我希望经过一次绝望的尝试,可能会出现此问题,因为我在不同的文件夹中有多个index.js,因此我更改了除根目录中的所有名称以外的所有名称,但问题仍然存在。这就是为什么在错误日志中有一个middleware/middleware.js的原因,它是在重命名middleware/index.js之后。
编辑:
我尝试使用rfr将我的引用从require('../middleware')更改为rfr('middleware')。它仍然可以从控制台运行,但仍不能在容器内部。因此似乎该问题不会由于相对文件路径而发生。

最佳答案

原来我很傻(有点)。middleware/index.js内部的导入看起来像这个require('./verifySignUp')
如果我们查看verifySignup.js文件夹中的middleware文件,可以看到该文件的名称不带大写字母“U”。
为什么它仍然可以从控制台运行? verifySignup.js内部是以下代码:

module.exports = {
    authJwt,
    verifySignUp
};

在这里用大写的“U”写成。这意味着从控制台运行node index.js仅关心module.exports中写的内容,而不关心实际的文件名,但是在Docker内部运行时,文件名很重要。
将文件从verifySignup.js重命名为verifySignUp.js解决了我的问题。

关于node.js - 从Docker运行时的NodeJS App 'Module Not Found',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63693263/

相关文章:

javascript - Node.js 中的 $2y bcrypt 哈希

docker - "Docker compose: command not found"- 尽管配置了路径并将文件设置为可执行文件

docker - 装入的LVM卷未传递到容器

javascript - INSTAGRAM:授予公共(public)内容范围的权限,但访问 token 仍然给出未授权的错误

javascript - 可以将 coffeescript/javascript 中的其他对象属性动态添加到现有对象吗?

node.js - Node.js 中的 2 条腿服务器端 oauth 实现

javascript - 添加到 Node 中的数组/对象

docker - 使用 NFS 在主机之间共享 docker 镜像

node.js - 使用 sequelize 进行子查询以使用日期和时间过滤即将发生的事件

asp.net-mvc - node.js/expressjs/ejs中的StyleBundle和ScriptBundle等价于什么?