架构必须包含名为 "Project" 的唯一命名类型
Schema must contain uniquely named types named "Project"
我正在使用 type-orm 创建一个 Apollo Graphql 后端。我创建了一个名为 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
})
我得到的错误如下:
Error: Schema must contain uniquely named types but contains multiple types named "Project".
at new GraphQLSchema (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\graphql\type\schema.js:194:15)
at Function.generateFromMetadataSync (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\type-graphql\dist\schema\schema-generator.js:31:32)
at Function.generateFromMetadata (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\type-graphql\dist\schema\schema-generator.js:16:29)
at Object.buildSchema (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\type-graphql\dist\utils\buildSchema.js:10:61)
at C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\dist\index.js:42:38
at Generator.next ()
at fulfilled (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\dist\index.js:5:58)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
我不知道问题出在哪里,非常感谢您的帮助
我已经设法通过更改 class 'Project' 在 'ProjectResolver' class.
中的导入来解决问题
而不是:
import {Project} from '../entities/project'
现在看起来像这样:
import {Project} from '../../src/entities/project'
我正在使用 type-orm 创建一个 Apollo Graphql 后端。我创建了一个名为 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
})
我得到的错误如下:
Error: Schema must contain uniquely named types but contains multiple types named "Project". at new GraphQLSchema (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\graphql\type\schema.js:194:15) at Function.generateFromMetadataSync (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\type-graphql\dist\schema\schema-generator.js:31:32) at Function.generateFromMetadata (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\type-graphql\dist\schema\schema-generator.js:16:29) at Object.buildSchema (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\node_modules\type-graphql\dist\utils\buildSchema.js:10:61) at C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\dist\index.js:42:38 at Generator.next () at fulfilled (C:\Users\User\Desktop\UPV\Proyectos\Cv web\myweb-backend\dist\index.js:5:58) at processTicksAndRejections (internal/process/task_queues.js:97:5)
我不知道问题出在哪里,非常感谢您的帮助
我已经设法通过更改 class 'Project' 在 'ProjectResolver' class.
中的导入来解决问题而不是:
import {Project} from '../entities/project'
现在看起来像这样:
import {Project} from '../../src/entities/project'