Typescript Graphql架构类型错误,指示它没有的重复类型?

Typescript Graphql架构类型错误,指示它没有的重复类型?,typescript,graphql,apollo,Typescript,Graphql,Apollo,我现在已经完全浪费了晚上的时间试图解决这个问题,但即使经过多次搜索,我也无法找到答案 我有一个服务器,它抓取我的“.graphql”文件文件夹,并将它们合并到一个大文件夹中,然后与解析程序一起传递到“makeExecutableSchema()”,如下所示 const folders = fs.readdirSync(path.join(__dirname, './api')); const allResolvers = []; let

我现在已经完全浪费了晚上的时间试图解决这个问题,但即使经过多次搜索,我也无法找到答案

我有一个服务器,它抓取我的“.graphql”文件文件夹,并将它们合并到一个大文件夹中,然后与解析程序一起传递到“makeExecutableSchema()”,如下所示

        const folders      = fs.readdirSync(path.join(__dirname, './api'));
        const allResolvers = [];
        let typeDefs       = '';

        folders.forEach(folder => {
          if (folder !== 'directive') {
            typeDefs = typeDefs.concat(requireText(`./api/${folder}/${folder}.graphql`, require));
            const { resolver } = require(`./api/${folder}/${folder}.resolvers`);
            allResolvers.push(resolver);
          }
        });

        const resolvers = _.merge(allResolvers);
        return makeExecutableSchema({typeDefs, resolvers});
现在我不断地犯错误

    Error: Schema must contain unique named types but contains multiple types named "Address".
        at invariant (C:\100hotwater\src\server\node_modules\graphql\jsutils\invariant.js:19:11)
        at typeMapReducer (C:\100hotwater\src\server\node_modules\graphql\type\schema.js:216:58)
        at Array.reduce (<anonymous>)
        at C:\100hotwater\src\server\node_modules\graphql\type\schema.js:237:36
        at Array.forEach (<anonymous>)
        at typeMapReducer (C:\100hotwater\src\server\node_modules\graphql\type\schema.js:232:51)
        at Array.reduce (<anonymous>)
        at new GraphQLSchema (C:\100hotwater\src\server\node_modules\graphql\type\schema.js:122:28)
        at Object.extendSchema (C:\100hotwater\src\server\node_modules\graphql\utilities\extendSchema.js:161:10)
        at buildSchemaFromTypeDefinitions (C:\100hotwater\src\server\node_modules\graphql-tools\dist\schemaGenerator.js:186:28)
        at _generateSchema (C:\100hotwater\src\server\node_modules\graphql-tools\dist\schemaGenerator.js:97:18)
        at Object.makeExecutableSchema (C:\100hotwater\src\server\node_modules\graphql-tools\dist\schemaGenerator.js:110:20)
        at Object.exports.allSchema (C:\100hotwater\src\server\helpers.js:22:28)
        at Server.graphQl (C:\100hotwater\src\server\index.js:28:34)
        at new Server (C:\100hotwater\src\server\index.js:17:14)
        at Object.<anonymous> (C:\100hotwater\src\server\index.js:42:19)
我注意到在文件“node_modules\graphql\type\schema.js:216:58”中,它似乎在打字过程中循环了两次,显然在检查中捕获了两次地址并发布了错误,但我仍然不确定从这里走到哪里。Graphql中这样的简单错误让人很难爱上它

感谢您的帮助

修复 简言之,感谢下面的Dan,我定义了地址类型,并将其用于输入(变异)和输出(查询线索)。当时我没有意识到的是,您需要以不同的方式定义类型和输入。下面是working.graphql模式

      type Lead {
        _id: String
        owner: User
        address: Address
        steps: [Step]
      }

      type Address {
        lat: Int
        lng: Int
        formattedAddress: String
      }

      type Mutation {
        createLead(
          owner: String!
          address: AddressInput 
          steps: [Step]
        ): Lead
      }

      input AddressInput {
        lat: Int
        lng: Int
        formattedAddress: String
      }

我不确定您的分解器模块是什么样子,但我怀疑您打算这样做:

const resolvers = _.merge(...allResolvers) // note the spread operator
否则,调用
merge
实际上并没有做任何事情,您的
resolvers
属性最终是一个数组而不是一个对象

编辑:在第一个glace上没有注意到它,但您正在使用类型作为输入。如果要使用与
地址
类型具有相同形状的对象,必须为其定义单独的输入类型:

type Address {
  lat: Int
  lng: Int
  formattedAddress: String
}

input AddressInput {
  lat: Int
  lng: Int
  formattedAddress: String
}

类型不能用于输入,输入不能用于类型。如果我们以编程方式定义模式,我们通常会看到这样的错误。显然,从SDL生成模式不会产生相同的错误。如果为Address和Step添加适当的输入类型,您的架构应该会正确生成。

谢谢,Daniel这实际上是一个问题,并且刚刚解决,但不幸的是,多类型问题仍然存在。@22Ryann Odd。你有可以分享的回购链接吗?如果看不到更多的底层代码,就很难知道会发生什么。在src/server/src/helpers.tsDaniel中,感谢您抽出时间。今晚我会更深入地研究,并更改我的文件。我实际上是在引用其他一些代码,我在不同的情况下使用了类型,它显然是错误的。我';如果你不喜欢的话,我会尽量把它贴出来,试着让你接受它;Daniel正在尝试创建新的lead,“lead.address的类型必须是Output类型,但Get:AddressInput。”
type Address {
  lat: Int
  lng: Int
  formattedAddress: String
}

input AddressInput {
  lat: Int
  lng: Int
  formattedAddress: String
}