redux传奇中的axios拦截器阻塞api调用



我有一个react原生项目,在该项目中,我正在使用redux-saga机制调用一些API。现在,当我为axios添加响应拦截器时,我的saga-api不再工作了。有人知道我该怎么解决吗?

这是我的axios实例类和响应拦截器的代码

const getLoggedInUser = async () => {
const savedUser = JSON.parse(
await getDataFromAsyncStorage(APP_CONSTANTS.SAVED_USER)
)
if (savedUser?.user_id != null) {
return savedUser
}
return null
}
const baseapi = axios.create({
baseURL: APP_CONSTANTS.BASE_URL,
headers: {},
})
baseapi.interceptors.request.use(
async (config) => {
const token = await getLoggedInUser()
const userId = token?.user_id
const authToken = token?.token
if (token) {
baseapi.defaults.headers.common['userId'] = token
baseapi.defaults.headers.common['token'] = authToken
}
return config
},
(error) => {
return Promise.reject(error)
}
)
// Response interceptor for API calls
baseapi.interceptors.response.use(
(response) => {
return response
},
async function (error) {
const originalRequest = error.config
if (error.response.status === 403 /* && !originalRequest._retry */) {
return baseapi(originalRequest)
}
return Promise.reject(error)
}
)

这是我的传奇类代码,当我添加一个响应拦截器时,它会直接失败

function* getTopicList(action) {
try {
yield put({type: ACTION_TYPES.START_TOPIC_LIST})
const {payload} = action
const res = yield call(getAllTopicsOfBatch, payload)
if (res?.status == APP_CONSTANTS.SUCCESS_STATUS) {
yield put({
type: ACTION_TYPES.SET_TOPIC_LIST,
payload: {data: res?.data?.topics},
})
} else {
alert('OOPS Something went wrong! Please try again')
yield put({
type: ACTION_TYPES.ERROR_TOPIC_LIST,
payload: 'Something Went Wrong Please Try Again',
})
}
} catch (error) {
console.log('RESPONES error', error)
alert('OOPS Something went wrong! Please try again')
yield put({
type: ACTION_TYPES.ERROR_TOPIC_LIST,
payload: 'Something Went Wrong Please Try Again',
})
}
}

代码看起来很好,我发现只有两件事可能会导致问题:

  1. 在请求拦截器中,您可能错误地将整个令牌作为userId而不是userId传递
baseapi.defaults.headers.common['userId'] = token // 'token' should be 'userId'
  1. 在响应拦截器错误处理程序中,不能保证在出现错误时具有"response"属性
if (error.response.status === 403) // use error?.response

如果这两件事都不能解决你的问题,我猜你的端点有问题,所以你应该检查你得到的响应错误来指导你。