NestJS GraphQL构建报错:无法确定createStock的输出类型
解决NestJS GraphQL中"Cannot determine a GraphQL output type for the 'createStock'"错误
以下是几种常见的错误原因及对应的修复方案:
1. Stock实体类缺少GraphQL装饰器
GraphQL无法识别未添加@ObjectType()和@Field()装饰器的类作为输出类型。确保你的实体类正确配置:
import { ObjectType, Field, Int } from '@nestjs/graphql'; import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @ObjectType() // 必须添加此装饰器标记为GraphQL输出类型 @Entity() export class Stock { @Field(() => Int) // 为每个需要暴露的字段添加@Field(),指定类型(如Int) @PrimaryGeneratedColumn() id: number; @Field() @Column() name: string; // 其他字段需同时添加@Field()和对应的TypeORM装饰器 }
2. 解析器的返回类型未正确定义
确保createStock mutation装饰器明确指定返回类型为Stock实体,且方法返回值类型匹配:
import { Resolver, Mutation, Args } from '@nestjs/graphql'; import { StocksService } from './stocks.service'; import { Stock } from './entities/stock.entity'; import { CreateStockDto } from './dto/create-stock.dto'; @Resolver(() => Stock) export class StocksResolver { constructor(private readonly stocksService: StocksService) {} @Mutation(() => Stock) // 显式声明输出类型为Stock async createStock(@Args('createStockDto') createStockDto: CreateStockDto): Promise<Stock> { return this.stocksService.create(createStockDto); } }
常见错误:
- 省略
@Mutation()中的返回类型(如仅写@Mutation()而非@Mutation(() => Stock)) - 返回
CreateStockDto而非Stock实体(DTO通常用@InputType()标记,仅用于输入)
3. CreateStockDto错误用作输出类型
输入DTO应使用@InputType()装饰器,不能直接作为输出类型返回:
import { InputType, Field } from '@nestjs/graphql'; import { IsString, IsNotEmpty } from 'class-validator'; @InputType() // 正确标记为输入类型 export class CreateStockDto { @Field() @IsString() @IsNotEmpty() name: string; // 其他输入字段 }
4. 字段缺失@Field()装饰器
实体类中所有需要在GraphQL输出中暴露的字段都必须添加@Field(),哪怕是基础类型(如string、number)。若某个字段遗漏此装饰器,可能导致整个类型无法被识别。
5. 模块配置问题
确保StocksModule正确导入GraphQLModule和TypeOrmModule,并注册实体:
import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { TypeOrmModule } from '@nestjs/typeorm'; import { join } from 'path'; import { StocksResolver } from './stocks.resolver'; import { StocksService } from './stocks.service'; import { Stock } from './entities/stock.entity'; @Module({ imports: [ GraphQLModule.forRoot({ autoSchemaFile: join(process.cwd(), 'src/schema.gql'), // 自动生成schema文件 }), TypeOrmModule.forFeature([Stock]), // 注册Stock实体 ], providers: [StocksResolver, StocksService], }) export class StocksModule {}
内容的提问来源于stack exchange,提问作者Arek Affek
相关产品推荐
相关产品推荐

