Firestore / Javascript: FirebaseError: функция DocumentReference.set () вызвана с неверными данными. Неподдерживаемое значение поля: не определено - PullRequest
0 голосов
/ 29 февраля 2020

Я получаю эту ошибку

Ошибка создания пользователя: FirebaseError: Функция DocumentReference.set () вызвана с неверными данными. Неподдерживаемое значение поля: undefined (найдено в поле diabetesComplication)

, и я думаю, что проследил проблему, которая связана с процессом получения всех входных данных флажков и их сохранения в массиве. Я также знаю, что мне нужно использовать код JSON.stringify(), прежде чем я сохраню их в пожарном депо.

В любом случае, мне нужна помощь в точном определении причины проблемы. Потому что в прошлом я успешно получал этот процесс сохранения массива прямо в firestore.

Вот код:

. JS

$('#registerForm').on('submit', async function (e) {
  e.preventDefault();
  var data = {
    email: $('#email').val(), //get the email from Form
    firstName: $('#fname').val(), // get firstName
    lastName: $('#lname').val(), // get lastName
    sex: $('#sex').val(),
    birthDate: new Date($('#bday').val()),
    diabetesType: parseInt($('#dtype').val()),
    weight: parseInt($('#weight').val()),
    height: parseInt($('#height').val()),
  };

  var allergyList = [];
  var cou = i.counter;
  for (c = 0; c <= cou; c++) {
    var allergyField = document.getElementById("allergy" + c).value;
    allergyList.push(allergyField);
    AllergyString = JSON.stringify(allergyList)
  };

  var arrayComplications = [];
  var checkboxes = document.querySelectorAll('input[type=checkbox]:checked');
  for (var i = 0; i < checkboxes.length; i++) {
    JSON.stringify(arrayComplications.push(checkboxes[i].value))
  }

  var passwords = {
    password : $('#password').val(), //get the pass from Form
    cPassword : $('#cpassword').val(), //get the confirmPass from Form
  }

  if( data.email != '' && passwords.password != ''  && passwords.cPassword != '' ){
    if( passwords.password == passwords.cPassword ){
      //create the user
      firebase.auth().createUserWithEmailAndPassword(data.email, passwords.password).then(function(user){setTimeout(function(){
            console.log('uid',user.user.uid);
            usersRef.doc(user.user.uid).set({
              'email': data.email, 'firstName': data.firstName, 
              'lastName': data.lastName, 'allergies': allergyList,
              'sex': data.sex, 'birthDate': firebase.firestore.Timestamp.fromDate(data.birthDate),
              'diabetesType': data.diabetesType, 'diabetesComplication': arrayComplications,
              'weight': data.weight, 'height': data.height, 'firstLogin': true,
         })}, 3000)
          .then(function(){
            console.log("User Information Saved:", user.user.uid);
            window.alert("User Created!");
            window.location.href = "patientDashboard.php"; 
            })               
          })
        .catch(function(error){
          console.log(arrayComplications);
          console.log("Error creating user: ", error);
          console.log("Error creating user: ", user.user.uid);
          window.alert("Error creating user:" + error);
        });

      }
  } 
});

Вот код:

HTML

                                <div class="col-md-6 pl-1">
                                    <div class="form-group">
                                        <label>Diabetes Complication</label>
                                        <br>
                                        <input type="checkbox" name="type" value="No Complications" /><b>No Complications</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Retinopathy" /><b>Retinopathy</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Neuropathy" /><b>Neuropathy</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Nephropathy" /><b>Nephropathy</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Cardiovascular"/><b>Cardiovascular</b>
                                    </div>
                                </div>
                            </div>

Обратите внимание, что код

  var allergyList = [];
  var cou = i.counter;
  for (c = 0; c <= cou; c++) {
    var allergyField = document.getElementById("allergy" + c).value;
    allergyList.push(allergyField);
    AllergyString = JSON.stringify(allergyList)
  };

- это то, что я ссылаясь ранее на успешное выполнение всего процесса сохранения.

РЕДАКТИРОВАТЬ

Вот код, с которым у меня возникают проблемы:

  var arrayComplications = [];
  var checkboxes = document.querySelectorAll('input[type=checkbox]:checked');
  for (var i = 0; i < checkboxes.length; i++) {
    JSON.stringify(arrayComplications.push(checkboxes[i].value))
  }

Я не могу получить значения флажков, сохранить в массив, сериализовать его и сохранить в firestore.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Сообщение об ошибке говорит вам точно, что идет не так. Вы вызываете set () и передаете ему объект, который содержит undefined для свойства с именем diabetesComplication. Вот что здесь происходит - я переформатировал код, чтобы его было легче читать:

usersRef.doc(user.user.uid).set({
    'email': data.email,
    'firstName': data.firstName, 
    'lastName': data.lastName,
    'allergies': allergyList,
    'sex': data.sex,
    'birthDate': firebase.firestore.Timestamp.fromDate(data.birthDate),
    'diabetesType': data.diabetesType,
    'diabetesComplication': arrayComplications,  // this contains undefined
    'weight': data.weight,
    'height': data.height,
    'firstLogin': true,
})

Строка, где diabetesComplicatation назначена arrayComplicatation - где-то есть неопределенное значение. Firestore просто не принимает неопределенные значения, так как нет эквивалентного представления. Вам нужно будет отладить свой код, чтобы выяснить, откуда поступает это неопределенное значение, или убедиться, что они удалены, прежде чем перейти к set().

Возможно, вы могли бы проверить наличие неопределенных значений в вашем for l oop идет от checkboxes[i].value до толчка в arrayComplications. (И я не уверен, почему вы пытаетесь систематизировать результаты pu sh. Кажется, это никуда не влияет.) От вас зависит, как это отладить, так как мы не можем увидеть все значения здесь.

0 голосов
/ 05 марта 2020

Я также нашел другое решение, я изменил свой тип ввода на флажки вместо выпадающих.

HTML

                                <div class="col-md-6 pl-1">
                                    <div class="form-group">
                                        <label>Diabetes Complication</label>
                                        <br>
                                        <input type="checkbox" name="type" value="No Complications" /><b>No Complications</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Diabetic Retinopathy" /><b>Retinopathy</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Diabetic Neuropathy" /><b>Neuropathy</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Diabetic Nephropathy" /><b>Nephropathy</b>
                                        <br>
                                        <input type="checkbox" name="type" value="Diabetic Cardiovascular"/><b>Cardiovascular</b>
                                        <br>
                                    </div>
                                </div>

Затем для скрипта я получил проверенные значения, сохраненные в массиве и сериализованные для хранения в хранилище.

var arrayComplications = [];
var checkboxes = document.querySelectorAll('input[type=checkbox]:checked');
for (var i = 0; i < checkboxes.length; i++) {
  JSON.stringify(arrayComplications.push(checkboxes[i].value));
}

Надеюсь, это кому-нибудь поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...