Структурирование проекта Express + GraphQL

Как поддерживать порядок в API GraphQL?

У меня есть эта простая конечная точка с тремя запрашиваемыми типами и аккуратная структура папок, например:

/api
  |--/entry
      |--/types.js
      |--/queries.js
      |--/mutations.js
  |--/category
      |--/types.js
      |--/queries.js
      |--/mutations.js
  |--/service
      |--/types.js
      |--/queries.js
      |--/mutations.js
  |--index.js

Index.js - это место, где я определяю свою корневую мутацию и запрос, что требует от меня явной ссылки на мои типы, запросы и мутации, поэтому, очевидно, этот файл будет расти по мере добавления новых типов, что как бы побеждает точку разделения их на разные папки в первую очередь.

// src/routes/api/index.js

const LOGGER = require('../../logger')('routes/api');
const EXPRESS_GRAPHQL = require('express-graphql');

// returned when requiring this module
const routes = function (handler) {

    LOGGER.log('info', 'Setting up api routes.');

    const {
        GraphQLSchema,
        GraphQLObjectType,
    } = require('graphql');

    const categoryQuery = require('./category/queries');
    const {
        updateCategory,
        deleteCategory,
        createCategory
    } = require('./category/mutations');

    const serviceQuery = require('./service/queries');
    const {
        updateService,
        deleteService,
        createService
    } = require('./service/mutations');

    const entryQuery = require('./entry/queries');
    const {
        updateEntry,
        deleteEntry,
        createEntry
    } = require('./entry/mutations');

    const RootQuery = new GraphQLObjectType({
        name: 'rootQuery',
        description: 'This is the root query which holds all possible READ entrypoints for the GraphQL API',
        fields: () => ({
            service: serviceQuery,
            category: categoryQuery,
            entry: entryQuery
        })
    });

    const RootMutation = new GraphQLObjectType({
        name: 'rootMutation',
        description: 'This is the root mutation which holds all possible WRITE entrypoints for the GraphQL API',
        fields: () => ({
            updateCategory,
            deleteCategory,
            createCategory,
            updateEntry,
            deleteEntry,
            createEntry,
            updateService,
            deleteService,
            createService
        })
    });

    const Schema = new GraphQLSchema({
        query: RootQuery,
        mutation: RootMutation
    });

    return EXPRESS_GRAPHQL({
        schema: Schema,
        pretty: true,
        graphiql: true,
    });
};

module.exports = routes;

Как мне этого избежать?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
995
1

Ответы 1

Что ж, это совсем не противоречит цели - у вас есть четко разделенные задачи в вашем приложении, и единственная причина роста index.js - это требование явно требовать все ваши модули.

Мы боролись с аналогичной проблемой и в итоге установили строгий интерфейс для того, что должен содержать каждый каталог моделей (entry/, category/, service/) и что должны экспортировать модули внутри. Благодаря этому вы можете написать аккуратную функцию-оболочку, которая динамически выводит список всех каталогов моделей при запуске и пытается загрузить их, ожидая указанный интерфейс. Благодаря этому вам вообще не нужно писать новый код на index.js. Вы просто копируете каталог, реализуете экспортированные функции, и они автоматически загружаются при запуске приложения.

Не забудьте добавить в загрузчик удобный журнал ошибок, чтобы избежать загадочных ошибок, когда вы случайно нарушаете контракт интерфейса.

Другие вопросы по теме