Firebase-admin не будет записывать в базу данных, не дает ошибок

Администратор Firebase не записывает в базу данных.

Я создаю базу данных:

var db = admin.database(); 

Затем, создав ссылку на таблицу, которую я хочу:

 var systemsRef = db.ref("systems/"); 

Затем у меня есть функция, чтобы проверить, существует ли «система» (зашифрованный идентификатор оборудования).

 function isSystemRegistered(id){ var isTrue; systemsRef.once('value', function(snapshot) { isTrue = (snapshot.hasChild(id))? true : false; }); return isTrue; } 

Который, по-прежнему возвращает false ; что true , потому что оно еще не существует. Если система не существует, она записывает данные.

 const sysID = getSysID(); var sys.info.name = generateUniqueSystemName(); if(isSystemRegistered(sysID){ console.log("system is already registered!"); } else { msystemsRef.set({ sysID : sys.info.name }, function(error){ console.log('There was an error while attempting to write to database: ' + error); }); }); } 

Я экспериментировал и временно сделал свою базу прототипов полной публикой в ​​течение нескольких минут, просто чтобы убедиться, что мои rules не были проблемой … Они не были: все еще нет буено. Нет записи в базу данных … и никаких ошибок .

Я попробовал другой set , просто убедитесь:

 msystemsRef.set("I'm writing data", function(error) { if (error) { alert("Data could not be saved." + error); } else { alert("Data saved successfully."); } }); 

Опять же, я использую учетную запись администратора с public правилами, поэтому я должен увидеть, что теперь I'm writing data таблицу I'm writing data , чуть ниже root. Ничего такого…

Поэтому я переключил тактику и попытался нажать на базу данных с помощью консервированного учебника, и моя firebase database все еще полностью открыта:

 systemsRef.push({sysID : sys.info.name}); 

И ничего … Хочешь, я пропала?

Убедитесь, что учетные данные и databaseURL верны.

 admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: databaseURL }); 

Проверьте, соответствуют ли они: учетные данные из одного приложения и базы данныхURL из другого существующего приложения могут привести к такому результату.

Если вы не загружаете данные учетных данных из файла, а из другого места, убедитесь, что они не изменены. У меня возникла проблема с новыми символами в закрытом ключе, когда данные учетных данных были переданы в переменную оболочки.

В isSystemRegistered вы возвращаете синхронизированное значение isTrue которое не undefined .

Вы должны вернуть promise метода .once('value') а в вызывающем методе attach then() проверить, существует ли он.

Вы также можете использовать snapshot.exists() для проверки ссылки на существование.

Редактировать:

Предлагаемое редактирование:

 var systemRef = admin.database('system'); function isSystemRegistered(id) { return systemRef.child(id).once('value') .then(function (snap) { return snap.exists(); }); } function writeData(aSystem) { var sysId = generateUniqueSystemName(); return systemRef.child(sysId) .once('value') .then(function (snapshot) { if (!snapshot.exists()) { return systemRef.child(sysId).update(aSystem); } // Here `sysId === snapshot.key` return systemRef.child(sysId).set(aSystem); }) .catch(function (err) { console.error(err); }); } 

Запуск на малине Пи вызывает еще несколько вопросов.

  • Как он подключается к Интернету?
  • Насколько быстро соединение?
  • Какую версию NodeJS вы используете?
  • Это успешно работает на вашем ПК?