#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