Интерфейс Node был еще в 2015-16 годах завезен в Relay Classic и это чисто релеевская приблуда. Мотивация Фейсбука: обновлять локальный кэш на автомате. Зная только этот ID можно дернуть ентити через поле Query.node: query { node(id: BASE64_ID) { …on EntityType{ field1, field2, field3 } }}. Реализация: графкуэльный ID исторически это base64(entityName + ‘:’ entityId). Такой формат позволяет десереализировать ID в резолвере Query.node на сервере. И там ты уже знаешь что за ентити и с каким айди нужны пользователю чтоб вытянуть из базы (хотя никто не мешал им вытягивать имя типа в фрагменте из 4го аргумента info в методе resolve. Но видимо тогда не доперли. Вот вам и base64 как костыль) Проблемы интерфейса node: клиентское двигло должно при билде нагенереть себе запросов с фрагментами `query { node(id: BASE64_ID) { …on EntityType{ field1, field2, field3 } }}. Сразу знать название ентити и набор полей. чтоб правильно составить эти фрагменты. А это практически нереально сделать. Поэтому обычно такие запросы герятся в рантайме, а это проблемы - нет возможности использовать persistented query - дыра по безопасности, очень легко проморгать проверку того, что Entity:123 нельзя показывать этому пользователю. Правильная реализация резолвера Query.node становится сложной задачей, плюс к этому мало какому клиенту эта приблуда нужна. Нужна наверное если в вашей бизнес логике это рельно руками заведено. Текущее положение: “Node interface + base64ID” в практике не показал своей пользы. В самом коде RelayModern я чет не припомню чтоб его где-то использовали. В Аполло обходятся __typename (имя типа) и id (реальный айдишник ентити из базы) – и это сейчас наиболее удобный вариант. ——— Резюме: - передавать id в base64 это уже никому ненужная приблуда (правда может быть что, это архитектурное решение и вы специально решили разнести айдишники, чтоб где-нибудь не опечататься, иметь хорошие логи и пр.) - сам Node интерфейс может использоваться для выделения из тьмы Output-Типов, которые являются Entity (но это как стандарт в туллингах нигде не используется). Т.е. юзаете для себя чисто for fun или для своих узких задач. Итог: в 98% приложений вам интерфейс Node и base64ID не нужны.
Обсуждают сегодня