更新依赖后NestJS+GraphQL出现UndefinedTypeError问题求助
我长期使用NestJS结合GraphQL开发,此前遇到UndefinedTypeError都能快速修复,但更新项目依赖后,所有未在@Field装饰器中显式指定类型的模型字段均触发该错误。
错误信息
/usr/src/app/node_modules/@nestjs/graphql/dist/utils/reflection.utilts.js:17 throw new undefined_type_error_1.UndefinedTypeError((0, lodash_1.get)(prototype, 'constructor.name'), propertyKey, index); ^ Error: Undefined type error. Make sure you are providing an explicit type for the "value" of the "ServiceHistoryModel" class. at reflectTypeFromMetadata (/usr/src/app/node_modules/@nestjs/graphql/dist/utils/reflection.utilts.js:17:19) at applyMetadataFn (/usr/src/app/node_modules/@nestjs/graphql/dist/decorators/field.decorator.js:31:107) at singleCallFunctionWrapper (/usr/src/app/node_modules/@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage.js:67:13) at /usr/src/app/node_modules/@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage.js:41:44 at Array.forEach (<anonymous>) at LazyMetadataStorageHost.load (/usr/src/app/node_modules/@nestjs/graphql/dist/schema-builder/storages/lazy-metadata.storage.js:41:26) at GraphQLSchemaFactory.create (/usr/src/app/node_modules/@nestjs/graphql/dist/schema-builder/graphql-schema.factory.js:35:53) at GraphQLSchemaBuilder.generateSchema (/usr/src/app/node_modules/@nestjs/graphql/dist/graphql-schema.builder.js:35:52) at GraphQLSchemaBuilder.build (/usr/src/app/node_modules/@nestjs/graphql/dist/graphql-schema.builder.js:22:31) at GraphQLFactory.generateSchema (/usr/src/app/node_modules/@nestjs/graphql/dist/graphql.factory.js:27:69)
对应的模型代码
@ObjectType() export class ServiceHistoryModel { @Field(() => ID) id: string; @Field() value: string; @Field({ nullable: true }) date?: Date; }
背景说明
该模型文件已一月未修改,期间多次本地及生产部署均正常。为字段添加显式类型(如() => String)可消除错误,但需修改所有模型的所有字段。尝试回退依赖版本、重新安装依赖均无效,恢复旧package-lock.json并通过npm ci重新安装可解决问题,但无法确定具体是哪个包导致故障。服务器部署时会重新安装依赖,仅使用旧锁文件并非长久之计,寻求根本解决办法。
根本解决方向
定位问题依赖包
用npm diff对比新旧package-lock.json,重点检查@nestjs/graphql、reflect-metadata、@nestjs/core、graphql这些核心包的版本差异,逐个锁定版本测试,找出触发问题的包。确认反射配置
检查项目入口文件(如main.ts)是否在最顶部导入reflect-metadata,同时锁定该包到之前正常的版本,避免其更新导致类型反射逻辑失效。校验TypeScript配置
确保tsconfig.json中开启emitDecoratorMetadata: true和experimentalDecorators: true,这两个是NestJS装饰器类型反射的必要配置,更新依赖后可能被覆盖。切换稳定版依赖
如果使用了@nestjs/graphql的beta/RC版本,切换到最新稳定版,同时查看官方GitHub Issues,确认是否有同类型问题及官方修复方案。批量修复临时方案
若暂时无法定位依赖问题,可编写Node脚本批量为@Field()添加对应显式类型(如string对应() => String,Date对应() => Date),减少手动修改工作量。
内容的提问来源于stack exchange,提问作者Aleksander

