Ошибка типа схемы Graphql, указывающая на дубликаты типов, которых у нее нет? - PullRequest
0 голосов
/ 16 мая 2018

Я теперь полностью потратил впустую мой вечер, пытаясь решить этот вопрос, но я не могу ответить, даже после нескольких поисков.

У меня есть сервер, который берет мои папки с файлами .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)

Эта схема наиболее определенноне содержит дубликатов, хотя, как показано ниже, распечатывается непосредственно перед входом в функцию «makeExecutableSchema» () ».

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

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

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

      type Step {
        goto: String
        key: String
        str: String
      }

      type User {
        _id: String
        email: String
        firstName: String
        lastName: String
        mobile: Int
        phone: Int
        billingAddress: String
        password: String
        leads: [Lead]
      }

      type Query {
        signedInUser: User
        userByEmail(email: String!): User # @isAuthenticated
      }

      extend type Mutation {
        signIn(email: String!, password: String!): SignInResponse!
        createUser(
          email: String!
          firstName: String!
          lastName: String
          mobile: Int
          billingAddress: String
          password: String
        ): User
      }

      type SignInResponse {
        token: String
        refreshToken: String
      }

Я заметил в файле« node_modules \ graphql \ type \ schema.js: 216:58 "Кажется, он дважды просматривает наборы и, очевидно, дважды проверяет адрес при проверке и публикует сообщение об ошибке, но я все еще не уверен, куда идти. Простые ошибки, подобные этой в Graphql, сильно затрудняют любовь.

Любая помощь приветствуется.

Исправление

Короче, благодаря Дану ниже, я определял тип адреса aи использую его как для моего Ввода (Мутация), так и для моего Введения (Запрос - Ведущий).В то время я не понимал, что вам нужно по-разному определять типы и входные данные.Рабочая схема .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
      }

1 Ответ

0 голосов
/ 16 мая 2018

Я не уверен, как выглядит один из ваших модулей распознавателя, но я подозреваю, что вы хотели сделать что-то вроде этого:

const resolvers = _.merge(...allResolvers) // note the spread operator

В противном случае, вызов merge на самом деле ничего не делает, и вашСвойство resolvers в конечном итоге становится массивом, а не объектом.

РЕДАКТИРОВАТЬ: Вы не заметили его на первый взгляд, но вы используете типы в качестве входных данных.Если вы хотите использовать объект той же формы, что и тип Address, вам необходимо определить для него отдельный тип ввода:

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

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

Типы нельзя использовать для входов, а входы нельзя использовать длятипы.Если бы мы определяли схему программно, мы бы обычно видели ошибку на этот счет.Очевидно, что создание схемы из SDL не приводит к той же ошибке.Если вы добавите соответствующие типы ввода для Address и Step, ваша схема должна сгенерироваться правильно.

...