在onauthstatechanged之后,currentuser仍然为null



我正在尝试使用Bearer令牌发出Axios请求
这是我的Axios功能。

import axios from "axios"
import {auth} from '../../config/firebase.config'
export function createRequest(upload) {
const tenantId = localStorage.getItem("tenantId")
const isUser = auth.onAuthStateChanged((user) => {
if (user) {
return auth.currentUser
}
});

if (isUser) {
const user = auth.currentUser;
const idToken = user.getIdToken(true);
return axios.create({
baseURL: `${process.env.REACT_APP_BASE_API_URL}/${tenantId}/`,
headers: {
"Content-type": !upload ? "application/json" : "multipart/form-data",
Authorization: `Bearer ${idToken}`
}
})
}
return null
}

但问题是我的用户id总是返回null。我参考了StackOverflow和firebase文档上的这个链接。我做的每件事都是按照医生的要求。但仍然不起作用。

传递给onAuthStateChanged的回调预计不会返回任何值,因此return auth.currentUser永远不会出现任何结果:

const isUser = auth.onAuthStateChanged((user) => {
if (user) {
return auth.currentUser
}
});

一个解决方案是在onAuthStateChanged之上创建自己的Promise,如本期GitHub文章中bojeil所示:

function getCurrentUser(auth) {
return new Promise((resolve, reject) => {
const unsubscribe = auth.onAuthStateChanged(user => {
unsubscribe();
resolve(user);
}, reject);
});
}

这样,你的代码就可以变成:

const isUser = await getCurrentUser(auth);

的(如果你不能使用await(:

getCurrentUser(auth).then((user) => {
...
})

onAuthStateChanged观察器等待,直到相关的可观察对象发出事件。然而,Javascript不会等待,因此auth对象可能处于中间状态。文件参考:https://firebase.google.com/docs/auth/web/manage-users#get_the_currently_signed-in_user。

在订阅中移动您的代码:

import axios from "axios"
import {auth} from '../../config/firebase.config'
export function createRequest(upload) {
const tenantId = localStorage.getItem("tenantId")
return auth.onAuthStateChanged((user) => {
if(user){
const idToken = user.getIdToken(true);
return axios.create({
baseURL: `${process.env.REACT_APP_BASE_API_URL}/${tenantId}/`,
headers: {
"Content-type": !upload ? "application/json" : "multipart/form-data",
Authorization: `Bearer ${idToken}`
}
})
}else{
return null;
}
});
}

我不能100%肯定上面的代码,因为我不能测试它。你可以尝试不同的变体,并询问更多。

相关问题:

  • 可以';t加载currentUser
  • 如何等待函数执行,直到订阅完成

最新更新