Дата и Json в определении типа для graphql

Можно ли определить поле как Date или JSON в моей схеме graphql?

type Individual {
    id: Int
    name: String
    birthDate: Date
    token: JSON
}

на самом деле сервер возвращает мне сообщение об ошибке:

Type "Date" not found in document.
at ASTDefinitionBuilder._resolveType (****node_modules\graphql\utilities\buildASTSchema.js:134:11)

И такая же ошибка для JSON ...

Любая идея ?

Хотя решения, приведенные в этой ветке, аппетитны и полны. Я видел, что когда вы используете такие адаптеры, как github.com/Soluto/graphql-to-mongodb - тогда мы не можем создавать наши собственные типы - поэтому в этой ситуации я напрямую сохраняю даты как время в миллисекундах в БД и использую тип с плавающей запятой. js имел (new Date ()). getTime () для помощи и использовал преобразователь, чтобы преобразовать его в требуемый формат даты в виде строки везде, где это необходимо - new Date (1324339200000); date.toString ("дд МММ");

Karan Bhandari 15.05.2021 07:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
42
1
35 480
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Взгляните на кастомные скаляры: https://www.apollographql.com/docs/graphql-tools/scalars.html

создайте новый скаляр в своей схеме:

scalar Date

type MyType {
   created: Date
}

и создайте новый резолвер:

import { GraphQLScalarType } from 'graphql';
import { Kind } from 'graphql/language';

const resolverMap = {
  Date: new GraphQLScalarType({
    name: 'Date',
    description: 'Date custom scalar type',
    parseValue(value) {
      return new Date(value); // value from the client
    },
    serialize(value) {
      return value.getTime(); // value sent to the client
    },
    parseLiteral(ast) {
      if (ast.kind === Kind.INT) {
        return parseInt(ast.value, 10); // ast value is always in string format
      }
      return null;
    },
  }),

как запрос в этом примере ?. 10.02.1993 ??

ValRob 17.03.2020 10:16

Просто хотел упомянуть, что этот фрагмент работает, только если дата, которую вы передаете, является числом. Например, «2020-01-01», хотя и является допустимой датой, не будет проанализирован, поскольку он только ожидает числа.

sfratini 17.10.2020 00:14

Примитивные скалярные типы в GraphQL - это Int, Float, String, Boolean и ID. Для JSON и Date вам нужно определить свои собственные скалярные типы, документация довольно ясно показывает, как это сделать.

В свою схему вы должны добавить:

scalar Date

type MyType {
   created: Date
}

Затем в свой код вам нужно добавить реализацию типа:

import { GraphQLScalarType } from 'graphql';

const dateScalar = new GraphQLScalarType({
  name: 'Date',
  parseValue(value) {
    return new Date(value);
  },
  serialize(value) {
    return value.toISOString();
  },
})

Наконец, вы должны включить этот настраиваемый скалярный тип в свои преобразователи:

const server = new ApolloServer({
  typeDefs,
  {
    Date: dateScalar,
    // Remaining resolvers..
  },
});

Эта реализация Date проанализирует любую строку, принимаемую Date конструктор, и вернет дату в виде строки в формате ISO.

Для JSON вы можете использовать graphql-type-json и импортировать его, как показано здесь.

Другие вопросы по теме