не удалось вставить данные в базу данных после создания пользователя при аутентификации - PullRequest
0 голосов
/ 05 мая 2018

Я хочу создать пользователя, который сможет аутентифицироваться в firebase, а затем вставлять данные пользователя в базу данных. Я использую следующий код:

this.app.auth().createUserWithEmailAndPassword(userForm.value.email, userForm.value.password)
        .then(res => {
            console.log('2 form data:', userForm.value);
            this._firebase.app.database().ref('users').push({
                email: userForm.value.email,
                uid: res.uid
            })
        })
        .catch(err => {
            console.log('Something went wrong:', err.message);
        });

Я использую app для вставки пользователя в authentication и _firebase для вставки данных пользователя в database. createUserWithEmailAndPassword работает, но я получаю следующую ошибку:

Reference.push failed: first argument contains undefined in property 'users.email'

userForm содержит данные пользователя. Что может быть не так?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Кажется, проблема в 'userForm.value.email'.

Самый простой способ получить входные данные формы - использовать двустороннее связывание с ngModel.

Если вы используете реактивные формы, используйте:

emailVal:string = this.formGroup.get('emailCtrl').value;

для получения значения элемента управления формы (emailCtrl) группы форм (formGroup)

0 голосов
/ 06 мая 2018

Действуйте следующим образом:

this.app.auth().createUserWithEmailAndPassword(userForm.value.email, userForm.value.password)
    .then(res => {
        console.log('2 form data:', userForm.value);

        var user = firebase.auth().currentUser;

        console.log(user.email);
        console.log(user.uid);

        return this._firebase.app.database().ref('users').push({
            email: user.email,
            uid: user.uid
        })
    })
    .catch(err => {
        console.log('Something went wrong:', err.message);
    });

Это нормально, что вы не получаете параметры, переданные функции в then. Асинхронная функция createUserWithEmailAndPassword "возвращает firebase.Promise, содержащую ненулевое значение firebase.auth.UserCredential", см. https://firebase.google.com/docs/reference/js/firebase.auth.Auth#signInWithEmailAndPassword

Таким образом, вы должны получить текущего пользователя в функции then с firebase.auth().currentUser;


РЕДАКТИРОВАТЬ после вашего комментария (edit2: который был удален: -))

Сделайте такую ​​функцию и вызовите ее с данными userForm:

function pushUser(userForm.value) {

    //create a JavaScript object holding the values you want to push to Firebase

    const objectToPush = {
        email: userForm.value.email,
        uid: userForm.value.uid,
        address: userForm.value.address,
        .....
    };

    return this.app.auth().createUserWithEmailAndPassword(userForm.value.email, userForm.value.password)
    .then(res => {

       //var user = firebase.auth().currentUser;  <- you don't need that anymore 
       //since you have the values in the object

        return this._firebase.app.database().ref('users').push(objectToPush);
    })
    .catch(err => {
        console.log('Something went wrong:', err.message);
    });

}

PS: позаботьтесь о том, чтобы this по-прежнему ссылался на то, что вы хотите.

0 голосов
/ 06 мая 2018

Я не могу комментировать, поэтому я поставлю свой ответ здесь,

this._firebase.app.database().ref('users').push

это не относится к базе данных, поэтому вам нужно определить в начале функции vat that = this, а затем передать свой код этому:

that._firebase.app.database().ref('users').push
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...