GraphQL output type

Viewed 2705

Trying to build NestJS + GraphQL + TypeORM backend and I am stuck on trying to create mutations and queries. Tutorials people solve the problem in exactly this way, but still I can't understand what the error is. Error: Cannot determine a GraphQL output type for the "createUser". Make sure your class is decorated with an appropriate decorator. All decorators seem to be okay. Anyone have same problem?

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 Answers

I noticed few possible causes for the error,

1. user.resolver.ts

@Mutation() decorator should return the type [User], not the type [CreateUserInput]

@Mutation(()=> [User]) // change here
 async createUser (@Args('data') data: userInput){
   return this.userService.createUser(data)
 }   

2. user.input.ts

If you encounter error : "Input" cannot be found in the registry, add @ArgsType() decorator to the class userInput

@InputType()
@ArgsType() //add decorator here
export class userInput {
  @Field()  name: string;
  @Field()  email: string;
  @Field()  password: string;
  @Field(type => RoleEnum) role: RoleEnum;
}

note: I used "@nestjs/graphql": "^7.10.3",

Related