Как правильно передавать заголовки при использовании SWR?

#javascript #next.js #next-auth #twitch-api #swr

Вопрос:

Я решил попытаться перенести большую часть своих функций API в SWR, поскольку это просто позволяет мне делать гораздо больше!

Проблема

Однако у меня возникла огромная проблема, из-за которой я не могу понять, как правильно передавать заголовки в SWR. Я просмотрел документы и многое другое, но, похоже, ничего не помогает. Я использую Twitch API, Next.js и NextAuth для обработки токенов, сеансов и т. Д. Я оставил свой репозиторий GitHub ниже вместе с кодом, который я сейчас пытаюсь использовать.

Примечание:

Я регистрирую в консоли возврат ошибки, если ошибка все же возникает, когда я захожу на страницу /dash , в которой говорится failed to load , что в журнале ошибок консоли нет?

Репозиторий Github

 import axios from "axios";
import Link from "next/link";
import {
  VStack,
  Heading,
  Divider,
  Text,
  Box,
  Badge,
  Center,
} from "@chakra-ui/react";
import { useSession } from "next-auth/react"
import useSWR from 'swr'

const fetcher = (url) => {
  const { data: session, status } = useSession()
  axios
    .get(url, { 
        headers: { 
          'Authorization': `Bearer ${session.accessToken}`,
          'Client-Id': `${process.env.TWITCH_CLIENT_ID}`
        }})
    .then((res) => res.data);
}
     
function Dash () {
  const { data, error } = useSWR(`https://api.twitch.tv/helix/streams/key?broadcaster_id=630124067`,fetcher)
  
  if (error) return (
    console.log(error),
    <div>Failed to load</div>
  )
  if (!data) return <div>loading...</div>

  return (
    <VStack>
      <Text>{data.user_name}</Text>
    </VStack>
  )
}

export default Dash
 

Ответ №1:

TL;DR: вы можете использовать массив в качестве key параметра useSWR для передачи нескольких аргументов fetcher функции.


Во-первых, useSession это перехват React, и его следует вызывать только на верхнем уровне компонента React / другого перехвата. Это позволяет избежать нарушения правил перехватов.

Во-вторых, вы должны переместить useSession вызов в Dash компонент. Затем вы можете вызвать fetcher условно (см. Условная выборка), когда session существует, и передать accessToken методу выборки, используя массив в качестве key параметра.

 function Dash() {
    const { data: session } = useSession()

    const { data, error } = useSWR(
        session ? ['https://api.twitch.tv/helix/streams/key?broadcaster_id=630124067', session.accessToken] : null, 
        fetcher
    )
  
    // Remaining code
}
 

Наконец, ваша fetcher функция должна быть немного изменена, чтобы принять accessToken параметр. Обратите внимание, что вам также нужен return оператор в axios вызове, чтобы он правильно возвращал данные.

 const fetcher = (url, accessToken) => {
    return axios
        .get(url, { 
            headers: { 
                'Authorization': `Bearer ${accessToken}`,
                'Client-Id': `${process.env.TWITCH_CLIENT_ID}`
            }
        })
        .then((res) => res.data);
}
 

Комментарии:

1. Спасибо за правки и ответ, токен на предъявителя успешно отправляется для аутентификации api, все работает отлично. Я ценю ту помощь, которую вы мне оказали здесь. Буду рекомендовать другим этот пост, если возникнет такая же проблема