Экспресс-рекомендации / GraphQL

#optimization #graphql #express-graphql

#оптимизация #graphql #экспресс-graphql

Вопрос:

Я изучаю GraphQL и ищу некоторые рекомендации о том, на правильном ли я пути, или я просто полностью не в курсе. По сути, я написал свой бэкэнд с помощью express-graphql и Prisma, я видел несколько разных руководств, в которых, казалось, типы и распознаватели писались отдельно, используя большие строки шаблонов для определения схемы. Я следовал руководству Net Ninja по GraphQL, которое использовалось new GraphQlObjectType() для построения схемы, и импортировал все различные типы в один корневой запрос, который затем передается в GraphQlSchema()

Мое замешательство и вопрос: правильно ли это делать?

В итоге я получил очень длинный файл схемы, который является функциональным и рабочим, но не идеальным для обслуживания. Я изо всех сил пытался найти в Интернете какие-либо примеры того, как разделить этот код и сохранить его работоспособность. Я пробовал экспортировать файл только из типов объектов GraphQL и импортировать их в schema.js файл, а затем создавать там свой корневой запрос, но, похоже, это не работает. Я пробовал экспортировать только поля как объект, а затем использовать оператор распространения для сборки моего корневого запроса, и я пробовал несколько new GraphQlSchema() операторов в своих файлах типов, а затем использовал graphql-tools mergeSchema , чтобы собрать все это вместе, но это тоже не сработало. На данный момент я немного запутался, и мне просто нужно какое-то руководство или пример для рассмотрения более крупного проекта, построенного таким образом.

Для справки, вот пример фрагмента, чтобы было понятно, как я построил свой серверный сервер GQL, чтобы уточнить, что запросы работают просто отлично, здесь я с благодарностью ищу совета по обслуживанию кода 🙂

Спасибо за любую помощь или примеры!

 const prisma = require("../config/prismaClient");
const graphql = require('graphql');

const {
    GraphQLObjectType,
    GraphQLSchema,
    GraphQLString,
    GraphQLList } = graphql;

const UserType = new GraphQLObjectType({
    name: "User",
    fields: () => ({
        id: { type: GraphQLString },
        first_name: { type: GraphQLString },
        last_name: { type: GraphQLString },
    })
})

const BusinessType = new GraphQLObjectType({
    name: 'Business',
    fields: () => ({
        id: { type: GraphQLString },
        name: { type: GraphQLString },
        street_address: { type: GraphQLString },
    })
})

const RootQuery = new GraphQLObjectType({
    name: 'RootQueryType',
    fields: {
        users: {
            type: new GraphQLList(UserType),
            async resolve() {
                return await prisma.users.findMany();
            }
        },
        businesses: {
            type: new GraphQLList(BusinessType),
            async resolve() {
                return await prisma.businesses.findMany();
            }
        }
    }
})

module.exports = new GraphQLSchema({
    query: RootQuery
})
 

Ответ №1:

Мое замешательство и вопрос: правильно ли это делать?

Не существует правильного или неправильного способа написания вашей схемы. Вы можете использовать SDL (язык определения схемы), который очень удобочитаем, но затем вам нужно добавить некоторые зависимости в свой проект, чтобы настроить это. В GraphQL Tools есть очень хорошие утилиты, которые упрощают написание вашей схемы.

Да, это может быть немного сложно при попытке настроить эти инструменты. Мне нравится разделять мою схему и преобразователи в каталоге на основе Type , а затем graphql-tools помогает мне объединить все преобразователи и схему в один. Я нашел этот проект https://github.com/lucassus/bookshelf взгляните на то, как они структурировали там сервер graphql https://github.com/lucassus/bookshelf/tree/master/apps/server/src/interfaces/graphql