Клиент Apollo GraphQL создает статические страницы на Next.js getStaticProps

Итак, я изучаю GraphQL, реализуя клиент Apollo на Next.js, я никогда не реализовывал API GraphQL и не использовал Apollo, и у меня есть некоторые проблемы с созданием и обработкой запросов. Я хочу создать несколько статических страниц с помощью сервера SpaceX GraphQL, и я использую getStaticProps и getStaticPath для получения первых 10 результатов с сервера SpaceX, создания статических страниц из этих маршрутов и получения сведений о запуске для каждого из идентификаторов. Моя проблема в том, что я НЕ МОГУ заставить работать запрос сведений о запуске. Сервер отвечает 400. Поскольку структура верна, проблема должна быть при передаче переменной в запрос.

Опять же, я никогда не реализовывал клиент Apollo, у меня очень начальные знания о graphQL, и я не мог найти проблему при использовании документации. Я основал свой код на этом примере, я просто удалил хук useQuery, чтобы я мог сделать запрос внутри getStaticProps. https://www.apollographql.com/docs/react/data/queries/

// [launchId].tsx
import { initializeApollo } from '../../lib/ApolloClient'


export const getStaticPaths: GetStaticPaths = async () => {
  const apolloClient = initializeApollo()
  const {
    data: { launchesPast }
  } = await apolloClient.query({
    query: gql`
      {
        launchesPast(limit: 10) {
          id
        }
      }
    `
  })
  const paths = launchesPast.map(element => {
    return {
      params: {
        launchId: element.id
      }
    }
  })
  return {
    paths,
    fallback: false
  }
}

export const getStaticProps: GetStaticProps = async context => {
  const apolloClient = initializeApollo()
  const { launchId: id } = context.params
  // const id = '100'
  console.info('id', id)
  console.info(typeof id)
  const query = gql`
    query Launch($id: id) {
      launch(id: $id) {
        details
      }
    }
  `

  const {
    loading,
    error = null,
    data: { launch }
  } = await apolloClient.query({ query: query, variables: { id: id } })

  return {
    props: {
      launch,
      loading,
      error
    },
    revalidate: 20
  }
}
//ApolloClient.ts

function createApolloClient(): ApolloClient<NormalizedCacheObject> {
  return new ApolloClient({
    // ssrMode: typeof window === 'null',
    link: new HttpLink({
      uri: 'https://api.spacex.land/graphql/'
    }),
    cache: new InMemoryCache()
  })
}

/*
// ApolloClient Singleton
*/
export function initializeApollo(
  initialState = null
): ApolloClient<NormalizedCacheObject> {
  const _apolloClient = apolloClient ?? createApolloClient()

  if (initialState) {
    // Get existing cache, loaded during client side data fetching
    const existingCache = _apolloClient.extract()

    // Restore the cache using the data passed from
    // getStaticProps/getServerSideProps combined with the existing cached data
    _apolloClient.cache.restore({ ...existingCache, ...initialState })
  }

  // For SSG and SSR always create a new Apollo Client
  if (typeof window === 'undefined') return _apolloClient

  // Create the Apollo Client once in the client
  if (!apolloClient) apolloClient = _apolloClient
  return _apolloClient
}

export function useApollo(
  initialState: null
): ApolloClient<NormalizedCacheObject> {
  const store = useMemo(() => initializeApollo(initialState), [initialState])
  return store
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 393
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Для тех, кто ищет это, это было глупое чтение SpaceX GraphQL API. Идентификатор типа - это идентификатор (конечно, я знаю), так что это исправлено.

const { launchId: id } = context.params
 const query = gql`
   query($id: ID!) {
     launch(id: $id) {
       id
       details
     }
   }
 `

 const {
   loading,
   error = null,
   data: { launch = null }
 } = await apolloClient.query({ query: query, variables: { id: id } })

Я также пытаюсь сделать страницы Next.js из ответа graphql. Решил использовать API-интерфейс spacex вместо моего собственного, чтобы не беспокоиться об авторизации прямо сейчас, а также имел тип String. Это был самый актуальный ответ, который я когда-либо находил

tris timb 25.03.2021 02:58

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