我正在尝试访问一个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'
}
});
控制台从ApiToken类返回什么
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9uZXQtYXBwMS5oZXJva3VhcHAuY29tXC9hcGlcL3YxXC9sb2dpbiIsImlhdCI6MTU2NDkzMTcxMywiZXhwIjoxNTY0OTM1MzEzLCJuYmYiOjE1NjQ5MzE3MTMsImp0aSI6InpUMzV5NU43Q2NGejRTanciLCJzdWIiOiI1ZDMzNTcwNDgwMmRmMDAwMDc2YmFkOTciLCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.nhDmwYWS5NaGifg-atwEw4DwUNvvpv-I_Ntw5L9kmCc
通话中的Authorization标头:
Authorization: "Bearer [object Object]"
我尝试了很多不同的事情,但无法获取密钥,因此由于密钥无法正确返回,因此我可以在我的api调用中使用它而无需获取403。任何帮助都会很棒。
答案 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))
}