Docker环境启动NestJS报'retryAttempts'属性未定义错误
Docker环境启动NestJS报
Cannot read property 'retryAttempts' of undefined修复方案 报错现象
容器内执行nest start启动应用时抛出如下异常,本地运行无该问题:
worker | [Nest] 29 - 07/07/2022, 5:25:37 PM [ExceptionHandler] Cannot read property 'retryAttempts' of undefined +11ms worker | TypeError: Cannot read property 'retryAttempts' of undefined worker | at Function.<anonymous> (/dist/node_modules/@nestjs/typeorm/dist/typeorm-core.module.js:195:63)
问题根因
- 核心原因是依赖版本不兼容:
@nestjs/typeorm@8.1.4仅适配TypeORM 0.2.x系列版本,代码中会默认读取连接配置里的retryAttempts字段;而typeorm@0.3.x重构了整个连接配置结构,该字段的挂载位置发生变化,读取时就会报属性不存在的错误。 - 仅容器环境复现的原因:本地存在
package-lock.json锁定了实际安装的TypeORM版本,大概率本地装的是兼容的0.2.x版本;而Docker构建时没有复制lock文件进镜像,执行npm install --force会按照^0.3.6的版本规则拉取最新的不兼容版本,才会出现环境差异。 - 额外隐患:Dockerfile使用的基础镜像是
node:16.3.0-alpine,和package.json中engines声明的16.11.1版本不一致,也可能放大依赖安装、运行时的差异问题。
修复方案
二选一即可:
- 方案1(快速修复,无代码改动):将TypeORM版本固定为0.2.x系列的最终稳定版,修改package.json依赖:
"@nestjs/typeorm": "^8.1.4", "typeorm": "0.2.45",
- 方案2(长期维护推荐):升级
@nestjs/typeorm到9.x及以上版本,该版本原生适配TypeORM 0.3.x,修改package.json依赖:
"@nestjs/typeorm": "^9.0.1", "typeorm": "^0.3.6",
Docker配置优化(必做,避免后续版本不一致问题)
修正Dockerfile的依赖安装逻辑,保证容器和本地依赖版本完全对齐:
# 基础镜像版本和engines声明保持一致 FROM node:16.11.1-alpine as builder WORKDIR /app # 复制所有依赖描述文件,包括lock文件 COPY package*.json ./ # 用npm ci严格按照lock文件安装依赖,移除--force强制参数 RUN npm ci COPY . . RUN npm run build EXPOSE 8080 CMD ["npm", "run", "dev"]
注意:如果本地重新安装过依赖,需要先把最新的
package-lock.json提交到代码仓库,再重新构建镜像。
内容的提问来源于stack exchange,提问作者BeginnerDev
相关产品推荐
相关产品推荐

