Ошибка: FIREBASE FATAL ERROR: база данных инициализирована несколько раз - PullRequest
0 голосов
/ 18 апреля 2019

Введение

Я работаю над приложением, которое использует FireBase в качестве базы данных (База данных RealTime). Мы используем firebase-admin в бэкэнде (API REST, построенный на Node Express) только для операций, требующих прав администратора, таких как аутентификация пользователя, удаление учетной записи пользователя или тому подобное.

Краткое изложение проблемы

Итак, что я пытаюсь сделать, так это то, что пользователь, который одобрен администратором, должен изменить свой статус на true, так как его статус ожидал. Таким образом, приведенный ниже код отфильтровывает конкретного пользователя и ищет пользователя в базе данных и изменяет статус подтверждения на true. Я прокомментировал код, который обрабатывает работу базы данных.

Проблема:

У меня здесь две проблемы:

  1. Если я буду комментировать код операции базы данных, и если будет новая регистрация, то пользователю будет отправлено два письма от администратора. Во-первых, «регистрация прошла успешно», а во-вторых, «ошибка при регистрации» (что не должно происходить согласно коду).

  2. Если я удаляю комментарии о работе базы данных, возникает следующая ошибка:

Ошибка (во время работы): @ firebase / database: FIREBASE WARNING: Исключение было вызвано обратным вызовом пользователя.

Ошибка: FIREBASE FATAL ERROR: База данных инициализирована несколько раз. Убедитесь, что формат URL базы данных совпадает с каждым вызовом database ().

Код выглядит следующим образом:

router.get('/approval', (req, res) => {
    firebase.auth().onAuthStateChanged(function (user) {
        if (user) {
            let errors = [];
            var k = 0;
            var email = req.query.email;
            var keys = Object.keys(userData);
            console.log("email : " + email);
            for (k = 0; k < keys.length; k++) {
                console.log("user email : " + userData.email[k]);
                if (!(email.localeCompare(userData.email[k]))) {

                    console.log("user email : " + userData.email[k]);
                    var password = userData.password[k];
                    console.log("password taken ");
      firebase.auth().createUserWithEmailAndPassword(email, password)
       .then(function (user) {
            console.log("inside firebase");

            //Code to change user's approval status to true


            /*  var reference = require('../DatabaseRef/reference'); 
                var ref = reference.usersRef;
                ref.on('value', gotData, errData);
                 function gotData(data) {
                 var userData = data.val();
                 if (userData != null) {
                     var keys = Object.keys(userData);
                     var newPostKey = keys[k]; 


          firebase.database().ref().child('/BMS/UserDetails/' + newPostKey)
          .update({ approve: true });

                        }
                 }    

           function errData(err) {
                           console.log(err);
                       }

                                             */



      let transporter = nodemailer.createTransport({
         service: 'gmail', 
         auth: {
                user: '**********@gmail.com', 
                pass: '**********'
                }
         });

      let mailOptions = {
        from: '********@gmail.com', 
        to: email,
        subject: "Registration Successful", 
        text: "Registration is complete ,now you can try logging in through 
               link given below :.", 
        html: "<a href='http://localhost:5005/'>Login</a> " 
                            };

             transporter.sendMail(mailOptions, function (err, info) {
                                if (err)
                                    console.log(err)
                                else
                                    console.log(info);
                            });

                            errors.push({ msg: "Registered Successfully" });
                            res.render('./addUser', { userData, errors });


                        })

      .catch(function (error) {
                            var errorCode = error.code;
                            var errorMessage = error.message;


                            console.log("inside catch");

                            let transporter = nodemailer.createTransport({
                                service: 'gmail', 
                                auth: {
                                    user: '*********@gmail.com', 
                                    pass: '**********' 
                                }
                            });


        let mailOptions = {
          from: '**********@gmail.com', 
          to: email, // list of receivers
          subject: "Error during user registration", 
          text: "Error Found : " + errorMessage, 
          html: "<a href='http://localhost:5005/signup'>Register</a> " 

           };


       transporter.sendMail(mailOptions, function (err, info) {
            if (err)
                 console.log(err)
             else
                   console.log(info);
            });

       errors.push({ msg: errorMessage });
       res.render('./addUser', { userData, errors });

          })

                    break;
                }
            }
            console.log("out of for loop");
        }

        else {
            console.log("User not present");
            res.redirect('/')
        }

    })

})

1 Ответ

0 голосов
/ 20 апреля 2019

Относительно фатальной ошибки базы данных, это сработало для меня:

var db = admin.database();
db.ref("Path till child"+newPostKey).update({approve : true});

В этом случае путь до child = "BMS / UserDetails /"

...