我正在将我的CRA
应用程序转换为Nextjs
,并且遇到了Axios
拦截器模式的一些问题。
它可以工作,但我被迫创建一个Axios
示例并将其传递给每个API调用。
有没有更好的方法来做这件事?
以下是我现在掌握的情况:Profile.js
:
import { useSession } from 'next-auth/react'
function Profile(props) {
const { data: session } = useSession()
const [user, setUser] = useState()
useEffect(()=> {
const proc= async ()=> {
const user = await getUser(session?.user?.userId)
setUser(user)
}
proc()
},[])
return <div> Hello {user.userName}<div>
}
getUser.js
:
export default async function getUser(userId) {
const axiosInstance = useAxios()
const url = apiBase + `/user/${userId}`
const { data } = await axiosInstance.get(url)
return data
}
useAxios.js
:
import axios from 'axios'
import { useSession } from 'next-auth/react'
const getInstance = (token) => {
const axiosApiInstance = axios.create()
axiosApiInstance.interceptors.request.use(
(config) => {
if (token && !config.url.includes('authenticate')) {
config.headers.common = {
Authorization: `${token}`
}
}
return config
},
(error) => {
Promise.reject(error)
}
)
return axiosApiInstance
}
export default function useAxios() {
const session = useSession()
const token = session?.data?.token?.accessToken
return getInstance(token)
}
2条答案
按热度按时间wwtsj6pe1#
如果其他人有这个问题,我是这样解决它的(使用getSession):
获奖者:https://github.com/nextauthjs/next-auth/discussions/3550#discussioncomment-1993281
6pp0gazn2#
受@Jar的启发,我的版本将首先检查现有的auth头,然后使用await getSession。这样,等待请求的次数就少了