# #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);
})