Как использовать тип Time как скаляр в GraphQL SDL?
У меня есть объект "бизнес", и я пытаюсь схематизировать его в GraphQL. Поскольку DateTime и Time по умолчанию недоступны в Graphql, я столкнулся со следующей библиотекой: github.
Business.graphql:
type Business {
businessId: ID!
name: String!
createdAt: Date!
closeHour: Time
}
К сожалению, библиотека предоставляет только DateTime. Как я могу использовать только "Время" (например, 15:00 или 09:45) для свойства closeHour? Есть ли другая библиотека, которая может помочь?
1 ответ
"Дата" и "DateTime" могут быть непростыми. Например, 15:00 15:00 по тихоокеанскому времени?
Многие (большинство) реализаций решают проблему, сохраняя "datetime" как большое целое число относительно некоторой "эпохи". Например, "0" может представлять "количество секунд с 1 января 1970 года".
Возможно, вы могли бы подумать о том, чтобы сохранить GraphQL "DateTime" в виде строки ISO8601 или использовать этот модуль: https://www.npmjs.com/package/graphql-iso-date
На уровне "схемы" (по сравнению с кодом JS, как я предлагал выше) вы можете подумать об этом:
3.5 Скаляры:
Скаляры ScalarTypeDefinition Описание optscalarNameDirectivesConstopt Скалярные типы представляют примитивные конечные значения в системе типов GraphQL. Ответы GraphQL имеют форму иерархического дерева; листья на этих деревьях являются скалярами GraphQL.
Все скаляры GraphQL могут быть представлены в виде строк, хотя в зависимости от используемого формата ответа для данного скалярного типа может быть более подходящий примитив, и сервер должен использовать эти типы, когда это необходимо.
GraphQL предоставляет ряд встроенных скаляров, но системы типов могут добавлять дополнительные скаляры с семантическим значением. Например, система GraphQL может определить скаляр с именем Time, который, будучи сериализованным в виде строки, обещает соответствовать ISO-8601. При запросе поля типа Time вы можете положиться на способность анализировать результат с помощью анализатора ISO-8601 и использовать специфичный для клиента примитив для времени.