Express后端执行npm start时出现chai TypeError: util.addProperty is not a function
此前应用运行正常,昨日新增功能和测试用例(未添加任何新依赖,已通过Github提交记录确认)后,npm run test可正常执行测试,但执行npm run dev或npm start时,chai抛出TypeError: util.addProperty is not a function错误。
已尝试的操作
- 搜索
TypeError: util.addProperty is not a function,无相关有效结果 - 重新安装chai和chai-as-promised
- 删除node_modules并执行
npm i重装所有依赖 - 将Node.js从18.7.0升级至18.16.0
报错信息
~~/node_modules/chai/lib/chai/assertion.js:94 util.addProperty(this.prototype, name, fn); ^ TypeError: util.addProperty is not a function at Assertion.addProperty (~~/node_modules/chai/lib/chai/assertion.js:94:10) at ~~/WechatBot_Server/node_modules/chai/lib/chai/core/assertions.js:48:15 at Array.forEach (<anonymous>) at module.exports (~~/node_modules/chai/lib/chai/core/assertions.js:47:46) at exports.use (~~/node_modules/chai/lib/chai.js:39:5) at Object.<anonymous> (~~/node_modules/chai/lib/chai.js:71:9) at Module._compile (node:internal/modules/cjs/loader:1254:14) at Module._extensions..js (node:internal/modules/cjs/loader:1308:10) at Module.load (node:internal/modules/cjs/loader:1117:32) at Module._load (node:internal/modules/cjs/loader:958:12) Node.js v18.16.0
package.json配置
"scripts": { "start": "node ./bin/www.js", "dev": "NODE_ENV=dev nodemon ./bin/www.js", "debug": "NODE_ENV=dev node --inspect ./bin/www.js", "test": "NODE_ENV=test mocha --recursive --exit --timeout 20000", "test:unit": "NODE_ENV=test mocha test/unit --recursive --exit --timeout 20000", "test:integration": "NODE_ENV=test mocha test/integration --recursive --exit --timeout 20000" }, "dependencies": { "app-root-path": "^3.1.0", "axios": "^1.3.5", "bcrypt": "^5.1.0", "chatgpt": "^5.1.3", "cookie-parser": "~1.4.4", "cors": "^2.8.5", "crypto": "^1.0.1", "debug": "~2.6.9", "dotenv": "^16.0.3", "express": "~4.16.1", "handlebars": "^4.7.7", "hirestime": "^7.0.3", "http-errors": "~1.6.3", "ioredis": "^5.3.2", "jade": "~1.11.0", "jsonwebtoken": "^9.0.0", "lodash": "^4.17.21", "mint-filter": "^4.0.2", "mongoose": "^7.0.0", "morgan": "~1.9.1", "nodemailer": "^6.9.1", "nodemon": "^2.0.21", "openai": "^3.2.1", "path": "^0.12.7", "readline": "^1.3.0", "redis": "^4.6.4", "redlock": "^5.0.0-beta.2", "remark": "^14.0.2", "strip-markdown": "^5.0.0", "supertest": "^6.3.3", "swagger-ui-express": "^4.6.2", "winston": "^3.8.2", "winston-mongodb": "^5.1.1" }, "devDependencies": { "chai": "^4.3.7", "chai-as-promised": "^7.1.1", "eslint": "^8.34.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0" }
排查方向与解决方案建议
检查生产环境代码是否意外引入chai
chai属于devDependencies,正常启动dev/start环境不应该加载它。排查业务代码(如bin/www.js、路由、工具类等),确认是否在非测试环境下不小心引入了chai或chai-as-promised(比如把测试代码的引用写到了业务逻辑里)。排查NODE_ENV环境变量差异
测试用NODE_ENV=test,dev用NODE_ENV=dev,start未指定环境变量。检查项目中是否有根据环境变量加载模块的逻辑,比如某模块在test环境下mock了util对象,但dev环境未做处理,导致chai依赖的util缺失addProperty方法。检查依赖版本冲突
执行npm ls chai查看chai的实际安装版本和依赖树,确认子依赖是否有版本异常。可以尝试锁定chai版本(将package.json中chai的^4.3.7改为4.3.7),重装依赖后测试。排查命名冲突
检查项目中是否有自定义的util模块,或某个依赖覆盖了全局util对象,导致chai加载的不是自身依赖的util模块。可在chai的assertion.js中临时添加console.log(util),查看输出对象定位来源。清理缓存与回退lock文件
执行npm cache clean --force清理npm缓存后重装依赖;若package-lock.json/yarn.lock有异常变更,可回退到之前正常版本后再重装。
内容的提问来源于stack exchange,提问作者chygo

