NestJS项目构建报错util_1.isObject is not a function排查求助
问题描述
重新构建8个月前可正常运行的NestJS项目时,使用以下Dockerfile构建:
FROM node:alpine as base WORKDIR /usr/src/app RUN apk add --no-cache ffmpeg COPY package*.json ./ COPY yarn.lock ./ RUN yarn COPY . . RUN yarn build EXPOSE 6666 CMD ["npm", "run-script", "start:beta"]
在yarn build阶段遇到错误:util_1.isObject is not a function,已确认未改动任何与"util"相关的代码,项目的package.json如下:
{ "name": "rg-nest", "version": "0.0.1", "description": "", "author": "", "private": true, "license": "UNLICENSED", "scripts": { "prebuild": "rimraf dist", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "cross-env NODE_ENV=development nest start", "start:dev": "cross-env NODE_ENV=development nest start --watch", "start:debug": "cross-env NODE_ENV=development nest start --debug --watch", "start:beta": "node dist/main", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch --verbose", "test:normal": "jest --silent --runInBand --detectOpenHandles", "test:cov": "jest --coverage --silent", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json", "generate": "run() { nest g mo \"$1\" && nest g co \"$1\" && nest g s \"$1\"; }; run" }, "dependencies": { "@casl/ability": "^5.4.3", "@ffmpeg-installer/ffmpeg": "^1.1.0", "@google-cloud/translate": "^7.2.1", "@nestjs/axios": "^1.0.0", "@nestjs/bull": "^0.4.2", "@nestjs/common": "^8.0.4", "@nestjs/config": "^1.0.1", "@nestjs/core": "^8.0.4", "@nestjs/event-emitter": "^1.0.0", "@nestjs/jwt": "^8.0.0", "@nestjs/mongoose": "^8.0.0", "@nestjs/passport": "^8.0.0", "@nestjs/platform-express": "^8.0.4", "@nestjs/platform-socket.io": "^8.1.2", "@nestjs/schedule": "^1.0.2", "@nestjs/serve-static": "^2.2.2", "@nestjs/swagger": "^5.0.8", "@nestjs/throttler": "^2.0.0", "@nestjs/websockets": "^8.1.2", "@sendgrid/mail": "^7.5.0", "agenda": "^4.3.0", "axios": "^0.24.0", "bcrypt": "^5.0.1", "bluebird": "^3.7.2", "bull": "^4.2.0", "cheerio": "^1.0.0-rc.10", "class-transformer": "^0.4.0", "class-validator": "^0.13.1", "cookie-parser": "^1.4.5", "csurf": "^1.11.0", "csv-parser": "^3.0.0", "exceljs": "^4.3.0", "express": "^4.17.1", "fluent-ffmpeg": "^2.1.2", "form-data": "^4.0.0", "fs-extra": "^11.3.0", "geoip-lite": "^1.4.7", "got": "10.2.0", "helmet": "^4.6.0", "http-proxy-middleware": "^2.0.3", "http-status-codes": "^2.1.4", "ical-generator": "^3.6.1", "imap": "^0.8.19", "imap-simple": "^5.1.0", "iso-639-1": "^2.1.15", "kurento-client": "^6.16.0", "livekit-server-sdk": "^1.2.7", "lodash": "^4.17.21", "mail-notifier": "^0.5.0", "mailparser": "^3.4.0", "mammoth": "^1.6.0", "moment": "^2.29.4", "moment-timezone": "^0.5.34", "mongoose": "^5.13.3", "mongoose-paginate-v2": "^1.3.18", "mongoose-unique-validator": "2.0.3", "nanoid": "^3.1.23", "nestjs-pino": "^2.2.0", "node-schedule": "^2.1.0", "nodemailer": "^6.7.2", "passport": "^0.4.1", "passport-custom": "^1.1.1", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", "pino-http": "^5.7.0", "pm2": "^5.1.2", "pxl": "^0.0.4", "pxl-for-emails": "^0.0.3", "pxl-mongodb": "^0.0.7", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.3.0", "swagger-ui-express": "^4.1.6", "typesense": "^1.0.2", "ua-parser-js": "^1.0.35", "validator": "^13.7.0", "xmlrpc": "^1.3.2" }, "devDependencies": { "@nestjs/cli": "^7.6.0", "@nestjs/schematics": "^7.3.0", "@nestjs/testing": "^8.0.4", "@types/bcrypt": "^5.0.0", "@types/bull": "^3.15.7", "@types/content-disposition": "^0.5.4", "@types/cookie-parser": "^1.4.2", "@types/cron": "^1.7.3", "@types/express": "^4.17.12", "@types/fluent-ffmpeg": "^2.1.20", "@types/jest": "^26.0.22", "@types/kurento-client": "^6.14.5", "@types/lodash": "^4.14.171", "@types/mail-notifier": "^0.5.0", "@types/multer": "^1.4.7", "@types/node": "^18.8.3", "@types/nodemailer": "^6.4.4", "@types/passport-jwt": "^3.0.6", "@types/passport-local": "^1.0.34", "@types/supertest": "^2.0.10", "@types/useragent": "^2.3.1", "@typescript-eslint/eslint-plugin": "^4.19.0", "@typescript-eslint/parser": "^4.19.0", "cross-env": "^7.0.3", "eslint": "^7.22.0", "eslint-config-prettier": "^8.1.0", "eslint-plugin-prettier": "^3.3.1", "install": "^0.13.0", "jest": "^27.0.6", "mongodb-memory-server": "^7.2.1", "npm": "^8.19.2", "prettier": "^2.2.1", "supertest": "^6.1.3", "ts-jest": "^27.0.4", "ts-loader": "^8.0.18", "ts-node": "^9.1.1", "tsconfig-paths": "^3.9.0", "typescript": "^4.3.5" }, "config": { "mongodbMemoryServer": { "debug": "on", "version": "4.4.7" } }, "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "modulePaths": [ "<rootDir>" ], "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s", "!**/node_modules/**", "!<rootDir>/common/constants/**", "!<rootDir>/typings/**", "!**/*.dto.(t|j)s", "!main.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" } }
原因排查与解决方案
核心原因:Node.js版本不匹配
你的Dockerfile使用node:alpine,会拉取最新的Node.js Alpine镜像,而8个月前的项目依赖是基于当时的Node.js版本构建的。util_1.isObject错误的本质是依赖包与当前Node.js版本不兼容:
- Node.js内置
util模块的API有变更,新版Node.js(如v20+)已移除util.isObject方法,但旧版依赖包仍在调用该API。 - 项目
package.json中@types/node指定为^18.8.3,但Docker镜像使用的Node.js版本远高于此,导致类型定义与实际运行环境不匹配。
具体修复步骤
锁定Node.js版本
修改Dockerfile基础镜像,指定与@types/node@18.8.3兼容的Node.js 18.x版本:FROM node:18-alpine as base确保构建环境的Node.js版本与项目开发时一致,消除API差异。
强制依赖版本一致性
构建时严格使用yarn.lock中的依赖版本,避免自动升级:
将Dockerfile中的RUN yarn替换为:RUN yarn install --frozen-lockfile检查并升级不兼容依赖
- 查看
yarn.lock中直接调用util.isObject的依赖包,升级到适配Node.js 18的版本,例如将@nestjs/cli从7.6.0升级到适配NestJS 8.x的最新版本。 - 若某些第三方包无法升级,可临时在项目入口文件添加兼容层:
此为临时方案,优先通过版本匹配解决根本问题。// src/main.ts 顶部 import * as util from 'util'; if (!util.isObject) { util.isObject = (obj: any) => obj !== null && typeof obj === 'object'; }
- 查看
内容的提问来源于stack exchange,提问作者bao.le
相关产品推荐
相关产品推荐

