2016-08-21 2 views
0

Прямо сейчас я хочу сохранить токен пользователя после успешного входа в систему.React Native Get Async Storage return Unhandled Promise

Вот мой код:

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 блоке, а потому, что ошибка является нормальным JavaScript Error и не axios error, он не имеет свойства response, поэтому попытка доступа к error.response.data вызывает неопределенную ошибку.

Самый простой способ обнаружить тип ошибки, чтобы утка-типа это: Если ошибка имеет response, то это ошибка Вардар, в противном случае другая ошибка:

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

Ошибка вызвана immediatelyResetRouteStack является вероятно, поступает из прохода рендеринга React, который синхронно выполняется в одном стеке вызовов. После того, как вы исправить сломанный .catch вы увидите, что сообщение об ошибке, но хорошая догадка для виновника в вашем ограниченном образце кода является:

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

Какой должна быть присваивание собственности, вместо вызова метода:

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

хорошо это все смысл. Я пытаюсь удалить мой 'catch', и все это работает нормально, но после того, как я исправлю' this.state = {token: ''} '. Благодаря! – ssuhat

Смежные вопросы