Как поддерживать порядок в 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;
Как мне этого избежать?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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