#firebase #heroku #firebase-realtime-database #firebase-admin
# #firebase #heroku #firebase-база данных в реальном времени #firebase-администратор
Вопрос:
Этот вопрос был ранее закрыт, сказав мне «обновить вопрос, чтобы он фокусировался только на одной проблеме;» Я не знаю, в чем проблема, и если бы я знал, я бы не публиковал этот вопрос. Несмотря на это, я внесу некоторые пояснения здесь:
- Ранее я использовал только обычный модуль Firebase (тот, который был импортирован с помощью «npm i firebase»); раньше все работало отлично. Проблема связана с аутентификацией (насколько мне известно) с помощью Firebase Admin SDK. Я не понимаю, как я должен отправлять это в сборку Heroku, не раскрывая файл JSON ключа учетной записи службы на моем GitHub.
- Что касается пути GOOGLE_APPLICATION_CREDENTIALS, есть ли способ, при котором мне не нужно устанавливать его каждый сеанс? Приложение Heroku перезапускается один раз в день, и мне нужно было бы как-то автоматизировать этот процесс ввода (или полностью пропустить его). Именно так я сейчас это понимаю. Вот цитата из предыдущего ответа:
Когда я устанавливаю путь GOOGLE_APPLICATION_CREDENTIALS, разве это не устанавливает его только на моем локальном компьютере?
Переменные среды работают только на отдельной машине и процессе, где они были установлены. Если вы хотите, чтобы он был установлен на другой машине и обрабатывался, вам придется договориться об этом отдельно. Согласно документации:
Задайте переменной среды GOOGLE_APPLICATION_CREDENTIALS путь к файлу JSON, который содержит ключ вашей учетной записи службы. Эта переменная применяется только к вашему текущему сеансу оболочки, поэтому, если вы открываете новый сеанс, установите переменную снова.
- Мой главный вопрос здесь заключается в следующем: «Я неправильно реализовал Firebase Admin SDK. Как мне сделать это правильно?»
- Даже простое размещение ссылки на руководства, которые могли бы помочь, было бы оценено (хотя я понимаю, что это обычно не рекомендуется, поскольку ссылки иногда прерываются).
Оригинал:
Примечание: я впервые использую Firebase Admin SDK, поэтому я действительно не уверен, что я делаю (хотя я довольно часто использовал Firebase).
Недавно я решил, что вернусь к одному из моих старых ботов Discord и фактически аутентифицирую его запросы в Firebase должным образом (я не делал этого раньше, поскольку я никогда раньше не аутентифицировался с сервера и не думал, что это возможно). Я обнаружил Firebase Admin SDK, который идеально подходил для моих нужд (кстати, бот размещен на Heroku).
Я нашел это руководство: https://firebase.google.com/docs/admin/setup , но есть несколько вещей, которые я не могу понять (обратите внимание, что это чисто риторические вопросы, вам не нужно отвечать на них в своем ответе; я просто предоставляю их, чтобы вы могли понять мой мыслительный процесс).:
- Когда я устанавливаю путь GOOGLE_APPLICATION_CREDENTIALS, разве это не устанавливает его только на моем локальном компьютере? Я мог бы также попробовать запустить команду экспорта на сервере (используя «heroku run» в командной строке), но тогда путь будет указывать на файл, который не существует на сервере (поскольку файл JSON ключа учетной записи службы находится на моем локальном компьютере). Нужно ли мне устанавливать переменную среды в Heroku или что-то в этом роде?
- Как «admin.credential.applicationDefault()» знает, как получить учетные данные?
Я не могу найти никаких других руководств, которые имеют смысл.
Способ, которым я в настоящее время его настраиваю, должен быть неправильным, поскольку чтение и запись завершаются беззвучно.
Код настройки Firebase:
// Setup Firebase:
const admin = require('firebase-admin');
// Initialize Firebase:
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://<APP>.firebaseio.com" // I removed the actual <APP> name to ask this question
});
let database = admin.database();
Такие вещи, как database.ref("test").set("Hello World!");
не изменяют данные в базе данных, и никаких ошибок не выдается (я также пытался прикрепить .затем и .catch до конца этого; все еще ничего). Это работало до того, как я переключился на Firebase Admin SDK (ранее я просто использовал модуль «firebase», а не модуль «firebase-admin», который я сейчас использую). То же самое касается чтения данных.
Любая помощь будет оценена.
Комментарии:
1. Приведенный вами «ответ» по-прежнему верен. Кажется, вы в основном спрашиваете о том, как настроить переменные среды на Heroku. Я бы переписал ваш вопрос, чтобы он был более конкретным, поскольку на самом деле у вас проблемы не с admin SDK.
2. @DougStevenson Я уже знаю, как настроить переменные среды; ключевая информация учетной записи службы хранится в файле JSON.
3. Хорошо, мне неясно, в чем заключается ваш вопрос. На самом деле я прочитал два вопроса в вашем сообщении — я предлагаю уточнить его до одного вопроса, который объясняет, что работает не так, как вы ожидаете, или где вы застряли с этим.
Ответ №1:
Вот в чем была моя проблема:
Я отправлял res.status(200)
вне асинхронного вызова firebase, завершая запрос до того, как firebase успела завершить. Каким-то образом localhost позволяет этому работать должным образом, но когда его размещенные вещи идут боком.
итак, у меня было это
fireabse.database().ref('parent/foo').set('bar');
res.status(200)
Мне это было нужно:
firebase.database().ref('parent/foo').set('bar').then(() => {
res.status(200);
});