Когда я пишу бэк-энд для одного из наших проектов, я понимаю, что был бы намного более счастлив послушать имперский марш, играемый на улице живой группой.
Так почему бы не автоматизировать часть процесса? (в конце стоит TL; DR)
Установка
Поскольку внешний интерфейс в данном случае не важен, давайте поговорим о задней части. Мы используем базу данных MySQL / MariaDB (на данный момент не совсем уверены, и поскольку мы используем knex.js, еще есть время принять это решение), knex.js для построения запросов и, как упоминалось в начале, стек apollo, который означает, что мы запускаем сервер apollo поверх express.js.
Если вы в какой-то мере знакомы со стеком apollo, вы знаете, что он поставляется с множеством отличных инструментов для упрощения вашей работы, но в основном для объединения ваших преобразователей со схемой. И вот что самое замечательное: вам не нужно использовать какие-либо конкретные функции в преобразователях, и вам полностью решать, как вы будете получать данные.
Но поскольку у нас довольно большая база данных, и я привык к ORM, я выбрал одну. Из заголовка видно, что мы используем objection.js. Я мог бы назвать вам множество причин, по которым objection.js полон, но поскольку в Интернете их полно, я позволяю вам, читателю, выяснить, пригоден ли он для вашего проекта (но вы можете найти некоторые субъективные мнения здесь).
Итак, теперь у вас есть довольно простой обзор того, что обслуживает данные, теперь для части автоматизации.
Схема и резолверы за один раз ... с одной уловкой
Было бы хорошо, если бы мне не приходилось писать схемы и преобразователи. У нас есть модели, почему не может быть и автоматического способа сделать это?
Это было основной мыслью: я написал модели, почему их нельзя каким-то образом подключить к серверу Apollo самостоятельно? Оказывается, могут.
Objection-graphql, созданный тем же экспертом по разработке, что и сам objection.js, делает именно это. Вы просто выбираете, из каких моделей генерировать shcema, и он будет делать это, включая резолверы.
Это просто:
let Schema = graphQlBuilder().model(Dog).model(Cat).build();
Вы можете получить весь API за считанные минуты. Есть загвоздка, это все публично. Что касается документации и моих попыток, вы не можете защитить серверную часть с помощью пользовательских проверок (например, если у него есть права на просмотр своего профиля). И это было для меня огромным недостатком.
Мое решение
Итак, начнем с ленивой части. Я не был уверен, сколько времени мне понадобится, чтобы написать собственный код, который преобразовал бы все в схему с резолверами, которые могли вводить какие-то пользовательские проверки, но я был уверен, что должно быть легко написать что-то для генерации простой схемы.
Когда вы смотрите на objection.js и это способ проверки модели (через схему JSON), он выглядит действительно знакомым. С этого момента он просто конвертировал ту точную схему, которую мы написали один раз для каждой модели, в схему grapqhl. Мы использовали только типы String, Integer, Id и Float, но вы никоим образом не обязаны создавать настраиваемые перечисления и все, что вам нужно.
Есть еще одна замечательная вещь - это создание собственной базовой модели, которую могут расширять все остальные модели.
В итоге результат выглядит так:
Что потом можно назвать так просто:
Dog.generateGraphSchema
TL; DR: Я создал пользовательскую функцию в базовой модели, которая преобразует схему JSON objection.js в схему grapqhl.