Схема должна содержать типы с уникальными именами с именем «Project»

#graphql #apollo #typeorm

#graphql #аполлон #typeorm

Вопрос:

Я создаю серверную часть Apollo Graphql с использованием type-orm. Я создаю объект с именем Project:

 import { Field, ObjectType } from "type-graphql";
import { BaseEntity, Column, Entity, ObjectID, ObjectIdColumn } from "typeorm";

@ObjectType()
@Entity()
export class Project extends BaseEntity {

  @Field(() => String)
  @ObjectIdColumn()
  id: ObjectID;

  @Field()
  @Column({ unique: true })
  name!: string;

  @Field()
  @Column()
  startDate!: Date;

  @Field()
  @Column({nullable: true})
  endDate!: Date
  
  @Field()
  @Column({unique:true})
  githubUrl: string;
}
 

и проект преобразователя:

 import { Arg, Mutation, Query, Resolver } from 'type-graphql'
import {Project} from '../entities/project'
import {ProjectInput, ProjectResponse} from '../types/ProjectTypes'

@Resolver()
export class ProjectResolver {  
    
  @Query(() => [Project])
  async getProjects(): Promise<Project[] | null> {     
    let projects = await Project.getRepository().find();
    return projects;
  }
    
  @Mutation(() => ProjectResponse)
  async createProject(
      @Arg("input") input: ProjectInput
  ): Promise<ProjectResponse>{
    let project : Project;
    if(input.name == ""){
        throw Error("Invalid input")
    }
    try{
        project = await Project.create({
            name: input.name,
            startDate: input.startDate,                                  
        }).save();        
    }catch (error) {
        if (error.code === 11000) {
          return {
            errors: [
              {
                field: "project",
                message: "The project name is already in use",
              },
            ],
          };
        } else return error;
    }
    return {project: project};
  }    

    @Mutation(() => ProjectResponse)
    async setProjectEndDate(
        @Arg("projectId") projectId: string,
        @Arg("endDate") endDate: Date
    ): Promise<ProjectResponse>{
        let project = await Project.getRepository().findOne(projectId)
        if(project){
            if(project?.startDate > endDate){
             return {
                 errors:[{
                         field:"EndDate",
                         message:"The end date must be a date after the start date of a project."
                     }]
                }   
            }
            project.endDate = endDate;
            project.save();
        }
        return {
            errors:[{
                field:"Project",
                message:"Project could not be found."
            }]
        }        
  }
}
 

это код 2 вспомогательных классов для ввода и ответа преобразователя:

 
@InputType()
export class ProjectInput{
    @Field()
    name: string

    @Field()
    startDate: Date

    @Field(()=> Date,{nullable:true})
    endDate?: Date | null

    @Field(()=> String, {nullable:true})
    githubUrl?: string

}

@ObjectType()
export class ProjectResponse{
  @Field(() => [FieldError], { nullable: true })
  errors?: FieldError[]
  
  @Field(() => Project, { nullable: true })
  project?: Project | null
}
 

это код, который я использую для создания объекта ApolloServer:

 const apolloServer = new ApolloServer({
    introspection: true,
    playground: true,
    schema: await buildSchema({
      resolvers: [ProjectResolver],
      validate: false, // Disable default GraphQL errors
    }),
    context: ({ req, res }) => ({ req, res}), // Enables use of context (with request) in resolvers
  })
 

И ошибка, которую я получаю, заключается в следующем:

Ошибка: Схема должна содержать типы с уникальными именами, но содержит несколько типов с именем «Проект». в новой GraphQLSchema (C:UsersUserDesktopUPVProyectosCv webmyweb-серверная часть node_modulesgraphqltypeschema.js:194:15) в Function.generateFromMetadataSync (C:UsersUserDesktopUPVProyectosCv webmyweb-backendnode_modulestype-graphql dist schema schema-generator.js:31:32) в функции.Генерироватьfrommetadata (C:UsersUserDesktopUPVProyectosCv webmyweb-backendnode_modulestype-graphqldistschemaschema-generator.js:16:29) в Object.buildSchema (C:UsersUserDesktopUPVProyectosCv webmyweb-backendnode_modules type-graphql dist utils buildSchema.js:10:61) в C:UsersUserDesktopUPVProyectosCv webmyweb-backenddistindex.js:42:38 в Generator.next () при выполнении (C:UsersUserDesktopUPVProyectosCv webmyweb-backenddistindex.js:5:58) в processTicksAndRejections (internal/process/task_queues.js:97:5)

Я не знаю, в чем проблема, поэтому я был бы признателен за вашу помощь

Ответ №1:

Мне удалось решить проблему, изменив импорт класса «Project», выполненный в классе «ProjectResolver».

Вместо: import {Project} from '../entities/project'

Теперь выглядит так: import {Project} from '../../src/entities/project'