Skip to content

Latest commit

 

History

History
21 lines (13 loc) · 3.62 KB

NodeInterface.md

File metadata and controls

21 lines (13 loc) · 3.62 KB

Что такое Node Interface?

Интерфейс 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 не нужны.