2016-08-21 2 views
0

지금 사용자 로그인 성공 후 사용자 토큰을 저장하고 싶습니다.React Native Get Async Storage 반환 처리되지 않은 약속

onPress(){ 
    return axios.post('https://api.example.net/v1/user/auth/login', { 
    email: this.state.email, 
    password: this.state.password, 
    }, { 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json', 
    }, 
    }).then((response) => { 
    AsyncStorage.setItem('token', response.data.login._cxz,() => { 
     console.log('success'); 
    }); 
    this.props.navigator.immediatelyResetRouteStack([{name: 'tweets'}]); 
    }) 
    .catch((error) => { 
     this.setState({errorMessage: error.response.data.message}); 
    }); 
} 

이미 response.data.login._cxz에 값이 있는지 확인하십시오

여기 내 코드입니다. 여기까지 작동합니다. 로그인하면 tweets 경로로 리디렉션됩니다. 내 tweets.js에

:

constructor(props){ 
    super(props); 
    this.state({token : ''}); 
    } 
    componentWillMount() { 
    AsyncStorage.getItem('token', (err, value) => { 

     console.log(value); 
    }) 
    } 

토큰을 저장하거나되지 않은 경우 내가 console.log 단순한 그것을 볼 수 있습니다. 하지만 로그인 할 때마다 성공 기록이 표시됩니다.

error

모든 솔루션을 내 트윗을 입력 할 때 난 항상이 오류가있어?

감사합니다.

답변

1

은 무엇 가능성이 일어나고있는 것은 then 콜백 navigator.immediatelyResetRouteStack에서 오류를 던지고 있다는 것입니다 :

.then((response) => { 
    AsyncStorage.setItem('token', response.data.login._cxz,() => { 
    console.log('success'); 
    }); 
    this.props.navigator.immediatelyResetRouteStack([{name: 'tweets'}]); 
}) 
.catch((error) => { 
    this.setState({errorMessage: error.response.data.message}); 
}); 

오류는 다음 catch 블록에서 잡힌,하지만 오류가 정상적인 자바 스크립트 Error 아닌 있기 때문에 axios 오류가 발생하면 response 속성이 없으므로 error.response.data에 액세스하려고하면 정의되지 않은 오류가 발생합니다.

오류의 종류를 감지 할 수있는 쉬운 방법은 오리 형 여기에 있습니다 :

.catch((error) => { 
    if (error.response && error.response.data) { 
    this.setState({errorMessage: error.response.data.message}); 
    } else { 
    this.setState({errorMessage: error.message}); 
    } 
}); 

immediatelyResetRouteStack로 인한 오류가 있습니다 : 오류가 response이있는 경우, 다음, 그렇지 않으면 다른 오류 Axios의 오류입니다 같은 호출 스택에서 동기식으로 실행되는 React 렌더링 패스에서 온 것일 수 있습니다. 당신이 깨진 .catch를 수정하면 오류 메시지가 무엇인지 볼 수 있지만 제한된 코드 샘플에서 범인에 대한 좋은 생각입니다

this.state({token : ''}); 

속성이 할당되어야하는 대신 메서드 호출의 :

this.state = {token : ''}; 
+0

모두 의미가 있습니다. 나는'catch '와 그것의 모든 것이 제대로 작동하는 것을 제거하려고 노력하지만'this.state = {token :' '}'을 수정 한 후에. 감사! – ssuhat

관련 문제