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

#javascript #node.js #express #graphql #apollo-server

#javascript #node.js #экспресс #graphql #apollo-server

Вопрос:

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

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

Я получаю от GraphQL при компиляции:

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

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

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

  • конфигурация
  • Модели
  • распознаватели
    • 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. Вы добавляете два пользовательских определения, одно внутри typeDefs/root.js: , а другое внутри typeDefs/user.js: . Просто удалите корневой, должно быть достаточно.

2. @Striped, хорошо… Я получаю только одну ошибку. Да, как и ожидалось. Но что, если несколько запросов определены для нескольких файлов, которые объединяются в typeDefs/index.js как видно?

3. У typeDefs вас все в порядке, если у вас есть extend ключевое слово для обоих типов внутри root.js . Я запустил код локально, и он работает нормально. Вы все еще видите ошибку о Query том, что она определена более одного раза? Если да, то какую версию apollo-server-express вы используете?

4. @DanielRearden Я добавил extend type Query amp; extend type User на typeDefs/user.js и теперь, кажется, это работает. Сделайте свой ответ.

Ответ №1:

Следуя шаблону глубокой модуляции, когда вы хотите иметь каждое определение типа в своем собственном файле, а каждый набор преобразователей — в своем собственном файле, вы хотите использовать 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