Как можно получить поле даты в Apollo Client из запроса как дату, а не строку?

Используя следующий graphql:

scalar Date

type MyModel {
  id: ID!
  date: Date!
}

query MyModels {
  myModels {
    id
    date
  }
}

type Query {
  myModel: [MyModel!]
}

и резолверы:

import { DateTimeResolver } from 'graphql-scalars'
const resolvers = {
  // Scalars
  Date: DateTimeResolver,

  myModels: async () => {
    return await context.user.getMyModels()
  }
}

Мой запрос возвращает date: "2021-02-07T06:58:51.009Z". Возможно ли, чтобы Apollo Client вместо этого преобразовал его в объект Date?


person Garrett    schedule 07.02.2021    source источник
comment
каждый / весь настраиваемый скаляр должен быть де- / сериализован, поиск по проблемам github для возможных решений (ссылка, преобразователь полей)   -  person xadm    schedule 07.02.2021
comment
Да, я нашел эту библиотеку, но не могу заставить ее работать: github.com/ eturino / apollo-link-scalars / issues / 244   -  person Garrett    schedule 08.02.2021


Ответы (1)


Выяснили это с помощью apollo-link-scalars:

import {
  ApolloClient,
  InMemoryCache,
  HttpLink,
  ApolloLink,
} from '@apollo/client'
import introspectionResult from 'shared/gql/generated.schema.json'
import { buildClientSchema, IntrospectionQuery } from 'graphql'
import { withScalars } from 'apollo-link-scalars'
import { DateTimeResolver } from 'graphql-scalars'

const schema = buildClientSchema(
  (introspectionResult as unknown) as IntrospectionQuery
)

const httpLink = new HttpLink({
  uri: 'http://localhost:4000',
  credentials: 'include',
})

const typesMap = {
  DateTime: DateTimeResolver,
}
const link = ApolloLink.from([
  (withScalars({ schema, typesMap }) as unknown) as ApolloLink,
  httpLink,
])

function createApolloClient() {
  return new ApolloClient({
    ssrMode: typeof window === 'undefined',
    link,
    // TODO: Save and hydrate from localStorage
    cache: new InMemoryCache(),
    // Necessary to pass the session cookie to the server on every request
    credentials: 'include',
  })
}

Я посмотрел на свою сгенерированную схему и обнаружил, что скаляр вызывается DateTime вместо Date, поэтому я изменил typeMap на DateTime: DateTimeResolver, и он работает.

person Garrett    schedule 07.02.2021