странная ошибка появляется при перемещении файлов с пути на другой — хранилище firebase — react js-redux

# #reactjs #firebase #firebase-storage #redux-firestore

Вопрос:

Я пытаюсь переместить все файлы из хранилища firebase на другой путь в том же хранилище firebase, когда пользователь удаляет основную коллекцию, поэтому появляется ошибка ниже: ошибка

Я попробовал и использовал следующую функцию:

     const restoreDeletedFile = (
    storageRef,
    fileArr,
    personRecordId,
    metadata,
    convertToOriginalPath = false
) => {
    // loop through files metadata
    let restoreFilesPromises = fileArr.map((file, index) => {
        return storageRef
            .child(file.data().path)
            .getDownloadURL()
            .then((url) => {
                // `url` is the download URL for the file
                // This can be downloaded directly:
                var xhr = new XMLHttpRequest();
                xhr.responseType = "blob";
                xhr.onload = () => {
                    let fileToUpload = xhr.response;

                    // upload a file to new path and remove the old one
                    // the new path = pr/id/image.jpeg
                    // the old path = deletedPR/pr/image.jpeg
                    return storageRef
                    // the new path
                    // convertToOriginal is to return filesName in the path as original
                    // ex: deletedPR/pr/fileName__documentId.extention to 
                    // pr/fileName.extention
                        .child(
                            formatFilePath(
                                file.data(),
                                personRecordId,
                                FILE_PATH.ORIGINAL,
                                convertToOriginalPath
                            )
                        )
                        // the old path
                        .put(fileToUpload, metadata[index])
                        .then(() =>
                          // remove old path
                            storageRef.child(file.data().path).delete()
                        );
                };
                xhr.open("GET", url);
                xhr.send();
                return url;
            });
    });
    return Promise.all(restoreFilesPromises);
};
 

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

приведенный ниже код показывает, когда я вызываю функцию:

                          .then(() =>
                            // fetch person record files
                            firestore
                                .collection("personRecords")
                                .doc("*deleted")
                                .collection("deletedRecords")
                                .doc(personRecordId)
                                .collection("files")
                                .get()
                        )
                        .then((docs) => {
                            fileArr = docs.docs;
                           // it saves the the docuemnet so good(I have checked firestore 
                           // document
                            fileArr.map((doc) => {
                                return firestore
                                    .collection("personRecords")
                                    .doc(personRecordId)
                                    .collection("files")
                                    .doc()
                                    .set({
                                        docSource: doc.data().docSource,
                                        lastModifiedDate:
                                            doc.data().lastModifiedDate,
                                        name: doc.data().name,
                                        path: formatFilePath(
                                            doc.data(),
                                            personRecordId,
                                            FILE_PATH.ORIGINAL
                                        ),
                                        size: doc.data().size,
                                        type: doc.data().type,
                                        uploaderId:
                                            doc.data().uploaderId,
                                    });
                            });
                        })
                        .then(() => {
                            // fetch files metadata
                            let getDeletedMetaDataPromises =
                                fileArr.map((file, index) => {
                                    return storageRef
                                        .child(file.data().path)
                                        .getMetadata();
                                });
                            return Promise.all(
                                getDeletedMetaDataPromises
                            );
                        })
                        .then((metadataSnapshot) => {
                            // metadata to use it later on..
                            metadata = metadataSnapshot.customMetadata;
                            return metadataSnapshot;
                        })
                       
                        .then(() =>
                          // i have console log all the parameters and they are ok, but I 
                           // still see the error above
                            restoreDeletedFile(
                                storageRef,
                                fileArr,
                                personRecordId,
                                metadata
                            )
                        )
 

Кто-нибудь сталкивался с этой проблемой?

Ответ №1:

Я забыл добавить обещание возврата.все (), и именно поэтому я столкнулся с этой ошибкой

               .then((docs) => {
                        fileArr = docs.docs;
                       // it saves the the docuemnet so good(I have checked 
                        firestore 
                       // document
                      let restorePromise=  fileArr.map((doc) => {
                            return firestore
                                .collection("personRecords")
                                .doc(personRecordId)
                                .collection("files")
                                .doc()
                                .set({
                                    docSource: doc.data().docSource,
                                    lastModifiedDate:
                                        doc.data().lastModifiedDate,
                                    name: doc.data().name,
                                    path: formatFilePath(
                                        doc.data(),
                                        personRecordId,
                                        FILE_PATH.ORIGINAL
                                    ),
                                    size: doc.data().size,
                                    type: doc.data().type,
                                    uploaderId:
                                        doc.data().uploaderId,
                                });
                        });
                  // added promise and the issue has been resolved
               return Promise.all(restorePromise);
                    })