Javascript React redux正在调度一个API操作,显然,请求发回401错误
我正在尝试在我的应用程序上创建用户身份验证。我创建了一个api,当在应用程序上发出请求时将调用该api,因此它可以使用我在请求对象中传递的id获取用户的数据 我现在遇到的问题是,当调用该api时,由于用户尚未登录,令牌为null,并且不会执行操作(userLoaded)以分派我捕获的getError和AuthError。catch应分派 我的redux控制台显示已调度userLoaded,但未调度getError和AuthError 这是代码Javascript React redux正在调度一个API操作,显然,请求发回401错误,javascript,reactjs,redux,Javascript,Reactjs,Redux,我正在尝试在我的应用程序上创建用户身份验证。我创建了一个api,当在应用程序上发出请求时将调用该api,因此它可以使用我在请求对象中传递的id获取用户的数据 我现在遇到的问题是,当调用该api时,由于用户尚未登录,令牌为null,并且不会执行操作(userLoaded)以分派我捕获的getError和AuthError。catch应分派 我的redux控制台显示已调度userLoaded,但未调度getError和AuthError 这是代码 The reducer import {AUTH_E
The reducer
import {AUTH_ERROR, LOGIN_FAIL, LOGIN_SUCCESS, LOGOUT_SUCCESS, REGISTER_FAIL, REGISTER_SUCCESS, USER_LOADED, USER_LOADING} from '../action/types'
const initialState = {
token : localStorage.getItem('token'),
isAuthenticated : null,
isLoading : false,
user : null
}
export default function (state=initialState, action){
switch (action.type) {
case USER_LOADING:
return {
... state,
isLoading : true
}
case USER_LOADED:
return {
...state,
isAuthenticated :true,
isLoading : false,
user : action.payload
}
case LOGIN_SUCCESS:
case REGISTER_SUCCESS:
return {
...state,
...action.payload,
isAuthenticated : true,
isLoading : false
}
case AUTH_ERROR:
case LOGIN_FAIL:
case REGISTER_FAIL:
case LOGOUT_SUCCESS:
localStorage.removeItem('token')
return {
...state,
token : null,
isLoading : false,
isAuthenticated : false,
user : null
}
default:
return state
}
}
This is the action
import {AUTH_ERROR, LOGIN_FAIL, LOGIN_SUCCESS, LOGOUT_SUCCESS, REGISTER_FAIL, REGISTER_SUCCESS, USER_LOADED, USER_LOADING} from './types'
import {returnError} from './errorActions'
// So the first thing i have to do here is to check for a token and load it
export const userLoaded = () => (dispatch, getState) => {
dispatch({type: USER_LOADING})
// get the token from the current state
const token = getState().auth.token
// creating our header
const req = {
headers : {"Content-Type":"application/json"}
}
// check if there's a token and if we have it, then we add it to the headers
if(token){
req.headers['x-auth-token'] = token
}
fetch('http://127.0.0.1:8000/auth/user', req)
.then(res => res.json())
.then(data => dispatch({
type : USER_LOADED,
payload : data
}))
.catch(err => {
dispatch(returnError(err.response.data, err.response.status))
dispatch({type: AUTH_ERROR})
})
}
使用fetch,只有在连接断开或类似情况下才会抛出错误。Fetch仍然会将401或500作为一个成功的请求来处理——这有点正确,因为在连接级别上没有发生任何错误。因此,您必须自己检查结果状态代码并进行相应的处理。使用fetch,只有在连接断开或类似情况下才会抛出错误。Fetch仍然会将401或500作为一个成功的请求来处理——这有点正确,因为在连接级别上没有发生任何错误。因此,您必须自己检查结果状态代码并进行相应处理。谢谢您的回答。老实说,我仍然无法理解如何使用FetchAPI处理这种情况,但是,由于我切换到axios,代码现在可以正常工作了。我仍然不明白为什么要使用axios。我真的希望我能完全理解你的意思,但我知道你是对的,所以我会接受答案,但如果你能更好地向我解释,我将非常感激。
fetch('http://127.0.0.1:8000/auth/user然后(res=>{if(res.code>299){throw Error(“Error”);}返回res;})
你只需要用自己的代码检查一下自己就行了。好了,现在我明白你的意思了!谢谢你抽出时间。非常感谢你的回答。老实说,我仍然无法理解如何使用FetchAPI处理这种情况,但是,由于我切换到axios,代码现在可以正常工作了。我仍然不明白为什么要使用axios。我真的希望我能完全理解你的意思,但我知道你是对的,所以我会接受答案,但如果你能更好地向我解释,我将非常感激。fetch('http://127.0.0.1:8000/auth/user然后(res=>{if(res.code>299){throw Error(“Error”);}返回res;})
你只需要用自己的代码检查一下自己就行了。好了,现在我明白你的意思了!谢谢你抽出时间。我很感激