GraphQL 输出类型

标签 graphql nestjs typeorm

尝试构建 NestJS + GraphQL + TypeORM 后端,但我一直在尝试创建突变和查询。教程人们正是以这种方式解决问题,但我仍然无法理解错误是什么。
错误:无法确定“createUser”的 GraphQL 输出类型。确保您的类使用适当的装饰器进行装饰。
所有的装饰者似乎都没问题。有人有同样的问题吗?
user.module.ts

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UsersResolver } from './user.resolver';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  exports:[TypeOrmModule],
  providers: [UserService,UsersResolver ],
})
export class UserModule {}
user.entity.ts
import {
  Column,
  Entity,
  OneToMany,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { Post } from '../post/post.entity';
import { Comment } from '../comment/comment.entity';
import { Field, ObjectType } from '@nestjs/graphql';

enum RoleEnum {
  Admin = 'Admin',
  Author = 'Author',
}

@Entity()
@ObjectType()
export class User {
  @PrimaryGeneratedColumn('uuid')
  @Field()
  id: string;

  @Column()
  @Field()
  name: string;

  @Column()
  @Field()
  email: string;

  @Column()
  @Field()
  password: string;

  @Column({
    type: 'enum',
    enum: RoleEnum,
    default: RoleEnum.Author,
  })
  @Field()
  role: RoleEnum;

  @OneToMany((type) => Post, post => post.user)
  @Field(type=>Post)
  posts: Post[];

  @OneToMany((type) => Comment, comment => comment.author)
  @Field(type=>Comment)
  comments: Comment[];
}
user.resolver.ts
   import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
   import { UserService } from './user.service';
   import { CreateUserDto } from './dto/createuser.dto';
   import { userInput } from './input/user.input';
   import { User } from './user.entity';
   @Resolver((of=>User))
   export class UsersResolver {
     constructor(private userService: UserService) {
     }
   
     @Mutation(()=> [CreateUserDto])
     async createUser (@Args('data') data: userInput){
       return this.userService.createUser(data)
     }   
   }
user.service.ts

    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { User } from './user.entity';
    import { Repository } from 'typeorm';
    import { CreateUserDto } from './dto/createuser.dto';
    
    @Injectable()
    export class UserService {
      constructor (@InjectRepository(User) private readonly userRepository: Repository<User>) {}
      async createUser (data: CreateUserDto): Promise<User> {
        const user = new User()
        user.name=data.name
        user.email=data.email
        user.role=data.role
        user.password=data.password
    
        await this.userRepository.save(user)
    
        return user
      }
    }
createUser.dto.ts

    import { Field, ObjectType } from 'type-graphql';
    import { registerEnumType } from '@nestjs/graphql';
    
    enum RoleEnum {
      Admin = 'Admin',
      Author = 'Author',
    }
    
    registerEnumType(RoleEnum, {
      name: 'RoleEnum',
    });
    
    @ObjectType()
    export class CreateUserDto {
      @Field()  name: string;
      @Field()  email: string;
      @Field()  password: string;
      @Field(type => RoleEnum) role: RoleEnum;
    }
user.input.ts

    import { Field, InputType } from 'type-graphql';
    import { registerEnumType } from '@nestjs/graphql';
    
    enum RoleEnum {
      Admin = 'Admin',
      Author = 'Author',
    }
    
    registerEnumType(RoleEnum, {
      name: 'RoleEnum',
    });
    
    @InputType()
    export class userInput {
      @Field()  name: string;
      @Field()  email: string;
      @Field()  password: string;
      @Field(type => RoleEnum) role: RoleEnum;
    }

最佳答案

我注意到错误的几个可能原因,
1. user.resolver.ts @Mutation()装饰器应该返回类型 [User] ,不是类型 [CreateUserInput]

@Mutation(()=> [User]) // change here
 async createUser (@Args('data') data: userInput){
   return this.userService.createUser(data)
 }   
2. user.input.ts
如果遇到错误:"Input" cannot be found in the registry ,
添加 @ArgsType()类的装饰器 userInput
@InputType()
@ArgsType() //add decorator here
export class userInput {
  @Field()  name: string;
  @Field()  email: string;
  @Field()  password: string;
  @Field(type => RoleEnum) role: RoleEnum;
}
注意:我用过 "@nestjs/graphql": "^7.10.3" ,

关于GraphQL 输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64042628/

相关文章:

node.js - NestJs运行时注入(inject)

postgresql - 在 GraphQL+Sequelize+CLS 中抛出错误后事务仍然自动提交

graphql - 当我实现 GraphQLModule 时,NestJS 与 GraphQL 出现问题

node.js - Graphql apollo 服务器解析器参数类型

javascript - NestJs 如何在特定时间每天运行 3 次 cron 作业

javascript - TypeORM 插入与relationId

mysql - 安全多公司协会

typeorm - 如何管理实现通用接口(interface)的实体?

javascript - graphql 查询嵌入在 req.body 中

reactjs - 使用 "auto-update"和 `react-apollo-hooks` 钩子(Hook)时如何避免 `useSubscription` 缓存