您尝试从猫鼬模型生成名称为“ Projects”的GraphQL类型,但是该类型已经存在于SchemaComposer中

问题描述

我使用不同的mongodb数据库来存储相同的猫鼬模式记录“页面”。因此,我希望有X个graphql端点-每个端点都应服务于所请求数据库的“页面”。

示例:localhost:3000/graphql/:database

因此,我创建了一个schemaComposer,它从路由中获取数据库名称(express> request.param.database)

import { composeMongoose } from 'graphql-compose-mongoose'
import { SchemaComposer } from 'graphql-compose'
import { Pages } from '../../mongoose/models/PagesModel.js'
import { Projects } from '../../mongoose/models/ProjectsModel.js'

const gqlSchemaComposerBuilder = (database) => {
    const gqlSchemaComposer = new SchemaComposer()

    const ProjectsTC = composeMongoose(Projects,{})
    const PagesTC = composeMongoose(Pages(database),{})

    gqlSchemaComposer.Query.addFields({
        pageMany: PagesTC.mongooseResolvers.findMany(),pageOne: PagesTC.mongooseResolvers.findOne(),projectMany: ProjectsTC.mongooseResolvers.findMany(),projectOne: ProjectsTC.mongooseResolvers.findOne()
    })

    gqlSchemaComposer.Mutation.addFields({
        projectCreateOne: ProjectsTC.mongooseResolvers.createOne(),projectUpdateOne: ProjectsTC.mongooseResolvers.updateOne(),projectRemoveOne: ProjectsTC.mongooseResolvers.removeOne()
    })

    return gqlSchemaComposer.buildSchema()
}

export default gqlSchemaComposerBuilder

问题是,两个composeMongoose声明都被包装到函数中时,出现此错误

{"errors":[{"message":"You try to generate GraphQL Type with name Projects from mongoose model but this type already exists in SchemaComposer. Please choose another type name \"composeWithMongoose(model,{ name: 'NewTypeName' })\",or reuse existed type \"schemaComposer.getoTC('TypeName')\",or remove type from SchemaComposer before calling composeWithMongoose method \"schemaComposer.delete('TypeName')\"."}]}

解决方法

默认情况下 composeMongoose() 使用全局 schemaComposer,因此您需要在 gqlSchemaComposer 的选项中传递您的 componseMongo

const gqlSchemaComposer = new SchemaComposer()

const ProjectsTC = composeMongoose(Projects,{ schemaComposer: gqlSchemaComposer })
const PagesTC = composeMongoose(Pages(database),{schemaComposer: gqlSchemaComposer})