#javascript #firebase #firebase-realtime-database
#javascript #firebase #firebase-realtime-database
Вопрос:
Я хочу пройти аутентификацию в своем приложении для чата, поэтому, когда пользователь регистрируется один раз, данные будут вставляться в базу данных firbase, но когда пользователь просто обновляет свой chrome, снова добавляются одни и те же данные, поэтому я хочу остановить дублирование, если пользователь уже вставлен, поэтому я попробовал этот код, упомянутый ниже, но это не работает.
function onStateChanged(user) {
if (user) {
//alert(firebase.auth().currentUser.email 'n' firebase.auth().currentUser.displayName);
var userProfile = { email: '', name: '', photoURL: '' };
userProfile.email = firebase.auth().currentUser.email;
userProfile.name = firebase.auth().currentUser.displayName;
userProfile.photoURL = firebase.auth().currentUser.photoURL;
var db = firebase.database().ref('users');
var flag = false;
db.on('value', function (users) {
users.forEach(function (data) {
var user = data.val();
if (user.email === userProfile.email) {
flag = true;
}
});
if (flag === false) {
firebase.database().ref('users').push(userProfile, callback);
}
else {
document.getElementById('imgProfile').src = firebase.auth().currentUser.photoURL;
console.log('elsepart')
document.getElementById('imgProfile').title = firebase.auth().currentUser.displayName;
document.getElementById('lnkSignIn').style = 'display:none';
document.getElementById('lnkSignOut').style = '';
}
});
}
else{
document.getElementById('imgProfile').src = image/profile-image.png;
document.getElementById('imgProfile').title = '';
document.getElementById('linkSignIn').style = '';
document.getElementById('linkSignOut').style = 'display: none';
}
}
let callback = (error)=>{
if(error){
alert(error)
}
else{
document.getElementById('imgProfile').src = firebase.auth().currentUser.photoURL;
document.getElementById('imgProfile').title = firebase.auth().currentUser.displayName;
document.getElementById('linkSignIn').style = 'display: none';
document.getElementById('linkSignOut').style = '';
}
}
///////////
onFirebaseStateChanged();
Комментарии:
1. Почему вы хотите снова хранить информацию о пользователе в отдельной таблице. Возможно, вы захотите вызвать admin.auth().ListUsers на стороне сервера и создать api для доступа к нему на стороне клиента.
2. на самом деле я создаю приложение для чата с аутентификацией Google, поэтому, когда пользователь входит в систему один раз, я получаю такие данные, как имя, адрес электронной почты, photoURL и сохраняю их в базе данных, но когда пользователь снова обновляет страницу, те же данные снова сохраняются в другой таблице.
Ответ №1:
для этого вы можете попробовать функции чтения и записи firebase, для справки: ссылка
Я сделал что-то похожее. Здесь я проверил свою базу данных на наличие одинаковых записей, если они не существуют, только тогда это позволит вам зарегистрироваться.
firebase.database().ref('/login/' username).once('value').then(function (snapshot) {
if (snapshot.val() === null || snapshot.val() === undefined) {
firebase.database().ref('login/' username).set({
name: name,
email: username,
password: password
});
_this.setState({
showAlert: true,
alertMessage: "User has been successfully register. Please login",
alertType: 'success'
})
} else {
console.log("in true")
_this.setState({
showAlert: true,
alertMessage: "User already exist",
alertType: 'warning'
})
}
Кроме того, для сохранения того же состояния входа в систему даже после обновления создание хранилища сеансов кажется мне простым решением.