【发布时间】:2020-10-30 17:12:53
【问题描述】:
我正在尝试使用 firebase.auth() 的 signInWithEmailAndPassword 功能创建登录页面 我可以创建用户,但我不能登录,我不明白为什么。
当我单击按钮 (touchableOpacity) 时,我应该转到进行登录的 signIn 函数并传递到另一个页面。但相反,它什么也没做,没有错误,但导航或错误电子邮件的错误都没有。
即使创建用户的功能有效并且我导航到同一页面,导航也已正确实现。
这是我的功能:
编辑:这是我的登录页面的完整代码
import getIdByEmail from './firebase/getIdByEmail';
import {IdContext} from './Context';
async function pushClient(email) {
//I WANT TO PASS SIZE+1 TO ALL PAGES
const size = await getID('Clients');
const newID = (size + 1).toString();
const docRef = firebase.firestore().collection('Clients').doc(newID);
await docRef.set({
Email: email
});
return (size+1);
}
async function getID(){
const snapshot = await firebase.firestore().collection('Clients').get();
return snapshot.size;
}
export default const LoginApp = props => {
const [Email, setEmail] = useState();
const [Pass, setPass] = useState();
const [SignPress, setSignPress] = useState();
const [CreatePress, setCreatePress] = useState();
const [id, setId] = useContext(IdContext);
const signIn = async(props) => {
const ID = await getIdByEmail(Email);
firebase.auth()
.signInWithEmailAndPassword(Email, Pass)
.then(() => {
setId(ID);
props.navigation.navigate('Skip');
})
.catch(error => {
if (error.code === 'auth/email-already-in-use') {
console.log('That email address is already in use!');
}
if (error.code === 'auth/invalid-email') {
console.log('That email address is invalid!');
}
console.error(error);
});
}
const createUser = () => {
firebase.auth()
.createUserWithEmailAndPassword(Email, Pass)
.then(() => {
pushClient(Email).then(id => {
setId(id);
props.navigation.navigate('ChooseRole');
});
})
.catch(error => {
if (error.code === 'auth/email-already-in-use') {
console.log('That email address is already in use!');
}
if (error.code === 'auth/invalid-email') {
console.log('That email address is invalid!');
}
console.error(error);
});
}
return(
<View>
<Button title="Create User" onPress={() => setCreatePress(!CreatePress)}/>
{CreatePress &&
<View >
<TextInput
style={styles.inputText}
placeholder="Email"
placeholderTextColor="#000000"
onChangeText={text => setEmail(text)}
/>
<TextInput
style={styles.inputText}
placeholder="Password"
placeholderTextColor="#000000"
onChangeText={text => setPass(text)}
/>
<TouchableOpacity
onPress={createUser} style={styles.loginBtn}>
<Text style={styles.buttonText}>continue</Text>
</TouchableOpacity>
</View>
}
<Button title="Sign In with Email" onPress={() => setSignPress(!SignPress)}/>
{SignPress &&
<View>
<TextInput
style={styles.inputText}
placeholder="Email"
placeholderTextColor="#000000"
onChangeText={text => setEmail(text)}
/>
<TextInput
style={styles.inputText}
placeholder="Password"
placeholderTextColor="#000000"
onChangeText={text => setPass(text)}
/>
<TouchableOpacity
onPress={signIn} style={styles.loginBtn}>
<Text style={styles.buttonText}>continue</Text>
</TouchableOpacity>
</View>
}
<Text> Welcome</Text>
</View>
);
}
getIdByEmail.js
const getIdByEmail = email => {
return new Promise((resolve, reject) => {
db.collection('Clients').get().then(data => {
data.docs.map(doc => {
const d = doc.data();
if (d.email === email) resolve(doc.id);
});
});
});
}
编辑:我希望当用户单击按钮登录时,出现 inputText 以插入电子邮件和密码,然后他们单击“继续”,系统应计算文档的 ID(我在创建时分配帐户),其中有他们的电子邮件;之后,我想传递到另一个名为“Skip”的页面(相同的导航器)
【问题讨论】:
-
您期望发生什么不同的事情?我们在这里看不到任何变量或文档数据,所以我们真的不知道 getIdByEmail 会发生什么。请编辑问题以包含足够的数据,以便任何人都可以重现该行为。
-
我编辑它,让我知道现在是否更好
标签: reactjs firebase react-native google-cloud-firestore firebase-authentication