为何出现"Cannot determine GraphQL output type"错误?Nest.js排查
解决 "Cannot determine GraphQL output type for getArticles" 错误
看起来你遇到的问题根源在于你的ArticleEntity类缺少TypeGraphQL所需的@ObjectType()装饰器,同时可能还有MongoDB ObjectId类型的映射问题。让我们一步步来解决:
1. 给ArticleEntity添加@ObjectType()装饰器
TypeGraphQL需要通过@ObjectType()装饰器来标记一个类作为GraphQL的对象类型,而你目前只添加了TypeORM的@Entity()装饰器。修改你的ArticleEntity:
import { ObjectType, Field, ID } from 'type-graphql'; // 导入所需的TypeGraphQL装饰器 import { Entity, ObjectIdColumn, Column } from 'typeorm'; import { ObjectId } from 'mongodb'; @ObjectType() // 必须添加这个装饰器! @Entity() export class ArticleEntity { @Field(() => ID) @ObjectIdColumn() _id: ObjectId; // 这里建议把类型从string改为ObjectId,匹配TypeORM的MongoDB字段类型 @Field() @Column() title: string; @Field() @Column() description: string; }
2. 处理ObjectId到GraphQL ID的转换(可选但推荐)
因为MongoDB的ObjectId不是GraphQL的原生类型,你可以通过class-transformer的@Transform装饰器将其自动转换为字符串,避免后续序列化问题:
import { Transform } from 'class-transformer'; // ...其他装饰器 @Field(() => ID) @ObjectIdColumn() @Transform(({ value }) => value.toString()) // 将ObjectId转为字符串 _id: ObjectId;
3. 检查NestJS模块配置
确保你的AppModule中正确配置了TypeORM和TypeGraphQL模块,并且注册了相关的实体和解析器:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeGraphQLModule } from '@nestjs/graphql'; import { join } from 'path'; import { ArticlesResolver } from './articles.resolver'; import { ArticlesService } from './articles.service'; import { ArticleEntity } from './article.entity'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mongodb', url: 'mongodb://localhost:27017/your-database-name', // 替换为你的本地MongoDB地址 entities: [ArticleEntity], synchronize: true, // 开发环境可用,生产环境建议关闭 }), TypeGraphQLModule.forRoot({ autoSchemaFile: join(process.cwd(), 'src/schema.gql'), // 自动生成GraphQL Schema文件 resolvers: [ArticlesResolver], // 注册解析器 }), TypeOrmModule.forFeature([ArticleEntity]), // 注册实体到TypeORM的Feature模块 ], providers: [ArticlesResolver, ArticlesService], }) export class AppModule {}
4. 验证解析器的返回类型
你的getArticles查询的返回类型标注是正确的,但确保你的ArticlesService的findAll方法确实返回ArticleEntity[]类型的实例(TypeORM的MongoRepository.find()会返回正确的实体实例)。
完成以上步骤后,重新运行nest start,这个错误应该就会消失了。如果还有问题,可以检查一下TypeGraphQL和NestJS的版本兼容性,确保使用的是匹配的版本(比如@nestjs/graphql和type-graphql版本要对应)。
内容的提问来源于stack exchange,提问作者Krzysztof Kaczyński
相关产品推荐
相关产品推荐

