反应本机异步存储解析

时间:2019-08-04 15:21:16

标签: react-native axios es6-promise asyncstorage

我正在尝试访问一个REST API终结点,该终结点要求您向其发送带有react native的令牌。出于开发目的,将其存储在APIToken类包装的Async Storage中,该方法有两种设置或获取令牌并返回令牌的方法。

import {AsyncStorage} from 'react-native';

class APIToken {
    constructor(){}
    async get(){
        try {
            const token = await AsyncStorage.getItem('api_token');
            if (token !== null) {
              // We have data!!
              console.log(token);
              return token
            }
          } catch (error) {
            // Error retrieving data
          }
          //return null
    }
    async set(token){
        try {
            await AsyncStorage.setItem('api_token', token);
            return token
          } catch (error) {
            // Error saving data
          }
          //return null
    }
}

export default APIToken

因此,我正在使用异步功能,希望可以将键解析为字符串值而不是Promise。当我使用这些函数调用api时,我会在控制台中正确返回密钥,但在标头中它会作为承诺返回。

const key = function() {
    const k = (new APIToken()).get()
    return k
  }


const api = axios.create({
    baseURL: Config.API_URL_V1,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + key(),
        'Cache-Control': 'no-cache'
    }
  });

控制台从A​​piToken类返回什么

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9uZXQtYXBwMS5oZXJva3VhcHAuY29tXC9hcGlcL3YxXC9sb2dpbiIsImlhdCI6MTU2NDkzMTcxMywiZXhwIjoxNTY0OTM1MzEzLCJuYmYiOjE1NjQ5MzE3MTMsImp0aSI6InpUMzV5NU43Q2NGejRTanciLCJzdWIiOiI1ZDMzNTcwNDgwMmRmMDAwMDc2YmFkOTciLCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.nhDmwYWS5NaGifg-atwEw4DwUNvvpv-I_Ntw5L9kmCc

通话中的Authorization标头:

Authorization: "Bearer [object Object]"

我尝试了很多不同的事情,但无法获取密钥,因此由于密钥无法正确返回,因此我可以在我的api调用中使用它而无需获取403。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

当您不使用await的调用键时,您在键函数和api函数中的输入是错误的;当您调用了不使用await的获取令牌时,您在键中的输入也是错误的。您需要将两个函数都转换为异步或使用Promise。下面的代码将解决您的问题。请尝试。

const key = async function () {
    const apiToken = new APIToken();
    const k = await apiToken.get();
    return k;
}


const api = async function () {
    var token = await key();
    return axios.create({
        baseURL: Config.API_URL_V1,
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + token,
            'Cache-Control': 'no-cache'
        }
    });
}

async function fetchEvents() {
    let request = await api();
    return request.get(Config.API_URL_V1 + 'events').catch((error) => console.log(error.response))
}