我正在Firebase上开发React应用。尽管在Google上已成功进行身份验证,但在进行火灾身份验证后,fire store没有设置userdata
的问题。如果您有一些解决方法,请帮助我。而且我在这里找不到错误文本。
login = () => {
const provider = new firebase.auth.GoogleAuthProvider();
firebase
.auth()
.signInWithRedirect(provider)
.then(result => {
const user = result.user;
const userRef = firebase
.firestore()
.collection("users")
.doc(user.uid);
userRef.get().then(function(doc) {
if (doc.exists) {
console.log("User data:", doc.data());
} else {
// doc.data() will be undefined in this case
userRef.set({
uid: user.uid,
name: user.displayName,
photoURL: user.photoURL
});
}
});
});
this.props.history.push("/");
};
'user' is not defined.
'userRef' is not defined
我尝试了代码。但是无法在此处定义user和userRef:
if (doc.exists) {
console.log("Doc for user " + user.uid + " already exists");
throw new Error("Doc for user " + user.uid + " already exists");
} else {
return userRef.set({
uid: user.uid,
name: user.displayName,
photoURL: user.photoURL
});
}
我不知道为什么,但是在Firebase身份验证上then
不起作用。
login = () => {
let user;
const provider = new firebase.auth.GoogleAuthProvider();
firebase
.auth()
.signInWithRedirect(provider)
.then(result => {
console.log("result", result);
// result has been skipped
答案 0 :(得分:1)
实际上,signInWithRedirect()
方法返回没有返回值的promise(即Promise<void>
)。因此,做
firebase
.auth()
.signInWithRedirect(provider)
.then(result => {...});
不起作用。
您需要使用getRedirectResult()
方法,如文档中所述:
使用整页重定向流对Firebase客户端进行身份验证。至 处理此操作的结果和错误,请参阅
firebase.auth.Auth.getRedirectResult
。
因此,在您的login
函数中,您应该只有两行:
login = () => {
const provider = new firebase.auth.GoogleAuthProvider();
firebase
.auth()
.signInWithRedirect(provider);
}
在代码的其他地方(我不知道确切的地方,我不知道reactjs ...),您需要使用以下代码(请注意chained中不同的Promises是如何)的: / p>
let user;
firebase
.auth()
.getRedirectResult()
.then(result => {
user = result.user;
const userRef = firebase
.firestore()
.collection('users')
.doc(user.uid);
return userRef.get();
})
.then(doc => {
if (doc.exists) {
console.log('Doc for user ' + user.uid + ' already exists');
throw new Error('Doc for user ' + user.uid + ' already exists');
} else {
return doc.ref.set({
uid: user.uid,
name: user.displayName,
photoURL: user.photoURL
});
}
})
.then(() => {
this.props.history.push('/');
})
.catch(error => {
console.log(error);
this.props.history.push('/errorPage');
});
请注意,如果多个用户能够使用同一个Google帐户登录,则在检查userRef
上文档是否不存在时,您可能需要使用Transaction。>