Проблема в том, что вы, вероятно, пытаетесь загрузить файл до того, как файл будет создан вашей облачной функцией, поскольку вы запускаете облачную функцию как триггер события, который автоматически запускается каждый раз при создании документа, но в то же время вы пытаетесь загрузить этот файл на ваш интерфейс. Отсутствие синхронизма создает странное поведение, которое вы наблюдаете.
Чтобы исправить это, вам следует сделать несколько вещей: функция вместо функции, запускаемой событием.
Это сделает так, чтобы ваша функция могла быть вызвана вашим внешним интерфейсом после создания документа и до того, как вы попытаетесь его загрузить, это может выглядеть как это:
exports.myFunction = (req, res) => {
//you can get the id of the document sent on the request here
const id=req.body;
...
};
Кроме того, вы можете проверить эту документацию для получения дополнительных сведений об этом типе триггера
- Создайте функцию загрузки и добавьте все ваш код для загрузки в него и добавить синхронности вашим операциям на вашем интерфейсе.
При этом ваш код будет выполняться в правильном порядке, а ваш main. js будет выглядеть так :
// Saves a new message on the Cloud Firestore.
function saveMessage() {
// Add a new message entry to the Firebase database.
firebase.firestore().collection('messages').add({
text: messageInputElement.value,
timestamp: firebase.firestore.FieldValue.serverTimestamp()
})
.then(function(docRef){
var obj = {
method: 'POST',
body: docRef.id
};
//calls function that adds to storage
fetch("YOUR_FUNTION_URL_HERE", obj).then({
//actually downloads
download();
}).catch(error) {
console.error('Failed to call cloud function', error);
});
}).catch(function(error) {
console.error('Error writing new message to Firebase Database', error);
});
}
function download(){
var storage = firebase.storage();
var gsReference = storage.refFromURL('gs://advan********8.appspot.com/audio/sub.mp3')
gsReference.getDownloadURL().then(function(url) {
// This can be downloaded directly:
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.onload = function(event) {
var blob = xhr.response;
};
xhr.open('GET', url);
xhr.send();
}).catch(function(error) {
// A full list of error codes is available at
// https://firebase.google.com/docs/storage/web/handle-errors
switch (error.code) {
case 'storage/object-not-found':
console.log('storage/object-not-found')
break;
case 'storage/unauthorized':
console.log('storage/unauthorized')
break;
case 'storage/canceled':
console.log('storage/canceled')
break;
case 'storage/unknown':
console.log('storage/unknown')
break;
}
});
}
// Checks that Firebase has been imported.
checkSetup();
// Shortcuts to DOM Elements.
var messageInputElement = document.getElementById('text');
var submitButtonElement = document.getElementById('download');
// Saves message on form submit.
submitButtonElement.addEventListener('click', saveMessage);
ПРИМЕЧАНИЕ : Все это не проверено, но это будет хорошей отправной точкой для вас, чтобы начать изменения, необходимые в вашем коде.