У меня есть некоторые проблемы с разрешениями для Firestore / Firebase, как при отправке данных из формы веб-сайта, так и из Google Cloud Functions. Я временно исправил это, я полагаю, установив переменную окружения GOOGLE_APPLICATION_CREDENTIALS
для моего ключа учетной записи службы Google перед повторным развертыванием в Firebase. Проблема остановилась на несколько часов и вернулась снова, хотя я не внес никаких изменений за это время. Есть идеи, почему это может быть так?
Я снова развернул после установки переменной среды GOOGLE_APPLICATION_CREDENTIALS
еще раз, и проблема снова исчезла.
ПРИМЕЧАНИЕ. Я не зацикливаюсь на своих учетных записях служб. У меня их несколько - один с ключом.
Вот сообщения об ошибках, которые у меня были раньше.
На консоли браузера :
Отсутствует или недостаточно прав
В журналах функций Google Cloud :
Ошибка записи документа: Ошибка: не удалось загрузить учетные данные по умолчанию.
РЕДАКТИРОВАТЬ:
Проблема возникла примерно через полчаса после исправления, но на этот раз только при отправке данных из Google Cloud Functions. Я снова развернул (с установленной переменной среды ключа учетной записи службы), и это было решено. Я полагаю, у меня нет правильной служебной учетной записи для функций / Admin SDK?
Нужно ли добавлять разрешения для моих учетных записей служб? Возможно, они назвали что-то firebase-adminsdk (2 из них) или «Учетная запись службы App Engine по умолчанию»?
Мой код :
const admin = require('firebase-admin');
exports.helloPubSub = functions.pubsub.topic('my-topic').onPublish((message) => {
// Get the `temp` attribute of the PubSub message JSON body.
let temp = null;
let humid = null;
try {
temp = message.json.temp;
humid = message.json.humid;
} catch (e) {
console.error('PubSub message was not JSON or does not inlcude this variable', e);
}
// Get the `published_at` attribute of the PubSub message JSON body.
let datetime = null;
try {
datetime = message.attributes.published_at;
} catch (e) {
console.error('PubSub message does not contain this attribute', e);
}
if (!admin.apps.length) { //Checking if the app has already been initialised, to avoid error
admin.initializeApp(functions.config().firebase);
}
const db = admin.firestore();
if (temp !== null && temp !== undefined) {
db.collection("data").add({
temp: temp,
humid: humid,
datetime: datetime,
})
.then(function () {
console.log("Temp and humid document was successfully written!");
return null;
})
.catch(function (error) {
console.error("Error writing document: ", error);
});
}
return true;
});