Сервер Apollo - ошибка GraphQL: может быть только один тип с именем «Запрос» - PullRequest
1 голос
/ 09 апреля 2019

Я новичок в GraphQL.Я следую нескольким инструкциям в Интернете, чтобы «создать» небольшое приложение, использующее Apollo Server + Express + GraphQL + MongoDB.

  • Я попытался скопировать это руководство YT (он создает файл root.js в папке typeDefs ).
  • Этот для целей тестирования.
  • И этот , чтобы убедиться в правильности структуры моей папки.

Я получаю данные из GraphQL при компиляции:

Ошибка: может быть только один типс именем «Пользователь».

Ошибка: может быть только один тип с именем «Запрос».

Я структурировал свой код следующим образом:

  • config
  • модели
  • распознаватели
    • index.js
    • user.js
  • typeDefs
    • index.js
    • root.js
    • user.js
  • index.js

До сих пор,мой код выглядит так:

typeDefs / user.js :

import { gql } from 'apollo-server-express';

const user = gql`
    type User {
        id: ID!
        name: String
        email: String
        password: String
    }

    type Query {
        getUsers: [User]
    }

    type Mutation {
        addUser(name: String!, email: String!, password: String!): User
    }
`;

export default user;

typeDefs / root.js :

import { gql } from 'apollo-server-express';

export default gql`
    extend type Query {
        _: String
    }

    type User {
        _: String
    }
`;

typeDefs / index.js :

import root from './root';
import user from './user';

export default [
  root,
  user
];

А затем вмой index.js :

import express  from 'express';
import  { ApolloServer, gql } from 'apollo-server-express';

import typeDefs  from './typeDefs';
import resolvers from './resolvers';

const server = new ApolloServer({ typeDefs, resolvers });
const app = express();
server.applyMiddleware({ app });

app.disable('x-powered-by');

app.listen({ port: 4000 }, () => {
  console.log(`Server running at http://localhost:4000${server.graphqlPath}`)
});

Что я делаю не так?

1 Ответ

1 голос
/ 06 июля 2019

При следовании шаблону глубокой модульности, когда вы хотите, чтобы каждое определение типа было в отдельном файле, а каждый набор преобразователей - в своем собственном файле, вы должны использовать ключевое слово extend и создавать «пустые» определения.

Предположим, что у вас есть определения типов root и user в отдельных файлах, индексный файл, который их объединяет, должен выглядеть следующим образом:

const user = require('./user');
const root= require('./root');
const typeDefs = gql`
    type Query{
        _empty: String
    }
    type Mutation {
        _empty: String
    }
    ${user}
    ${root}
`;

module.exports = typeDefs;

Вы используете

    type Query{
        _empty: String
    }

чтобы сделать пустой Query.Затем вы добавляете своего пользователя и root в конце.

В вашем пользовательском файле вы захотите следующее:

    extend type Query {
        getUsers: [User]
    }

Таким образом, ключевое слово extend - это расширение пустого запроса, созданного в файле индекса.

Подробнее о модульности вы можете прочитать здесь https://blog.apollographql.com/modularizing-your-graphql-schema-code-d7f71d5ed5f2

...