Хранение Firebase 'getDownloadURL' возвращается неопределенным - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь добавить изображение в хранилище базы данных, а также добавить данные в хранилище с помощью URL-адреса изображения. Изображение загружается в хранилище Firebase, но оно не возвращает URL, если я использую метод getDownloadUrl. Он возвращает эту ошибку:

Uncaught TypeError: Невозможно прочитать свойство 'getDownloadURL' с неопределенным

Вот так я получаю ввод и сохраняю данные:

//Add news to firestore
var storageRef = storage.ref('images');
const addNewsForm = document.querySelector('#addNewsModal');
var user = firebase.auth().currentUser;
addNewsForm?.addEventListener('submit', (e) => {
    e.preventDefault();

    //get user info
    const img = document.getElementById("uploadFile").files[0];
    const imgName = (+new Date()) + '-' + img.name;
    const metadata = { contentType: img.type };


    const title = document.getElementById("inputNewsTitle").value;
    const content = document.getElementById("inputNewsContent").value;
    const publisher = document.getElementById("inputNewsPub").value;

    if (user != null) {
        //Add Images to Firebase Storage
        // Create a child reference
        var imagesRef = storageRef.child(imgName).put(img, metadata);

        imagesRef.snapshot.storageRef.getDownloadURL().toPromise()
            .then(function(url)  {

                console.log('Image Url -> ' + url);
                // document.querySelector('#someImageTagID').src = url;


                db.collection("news").add({
                    newsImage: url,
                    newsTitle: title,
                    newsContent: content,
                    newsPublisher: publisher,
                    timestamp: firebase.firestore.FieldValue.serverTimestamp(),
                    adminUid: user.uid
                })
                    .then(function (docRef) {
                        console.log("Document written with ID: ", docRef.id);

                    })
                    .catch(function (error) {
                        console.error("Error adding document: ", error);
                    });

            }).catch(console.error);
    } else {
        console.log('User is null');
    }


});

Из вышеуказанный код; Сначала я получаю входное изображение, а затем отправляю его в хранилище файловой базы. Затем я передаю URL-адрес изображения и отправляю его в firebase firestore.

Мои правила хранения:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

1 Ответ

0 голосов
/ 07 апреля 2020

Вы неправильно работаете с API-хранилищем Firebase. Во-первых, эта строка:

var imagesRef = storageRef.child(imgName).put(img, metadata);

put () не возвращает ссылку. Как вы можете видеть из документации API, он возвращает UploadTask , который также работает как обещание. Если вы хотите получить URL-адрес для загрузки из загруженного файла, вам нужно будет дождаться завершения загрузки, а затем вызвать getDownloadURL по той же ссылке, которая использовалась для его загрузки, как показано в документации . Как минимум, вот так:

const imageRef = storageRef.child(imgName)
imageRef.put(img, metadata)
.then(snapshot => {
    return imageRef.getDownloadURL()
    .then(url => {
        // url is the download URL
    })
})
.catch(error => {
    // deal any errors
})

Ваши правила безопасности здесь не имеют значения, потому что вы показываете это для Cloud Firestore, а не для Cloud Storage. Это разные продукты с разными правилами. Вместо этого вам нужно будет обратить внимание на правила хранения.

...