# #firebase #google-cloud-platform #google-cloud-firestore #google-cloud-functions #firebase-storage
Вопрос:
Я создаю приложение, в котором пользователи могут загружать изображения. Я использую firebase в качестве серверной части. Теперь, поскольку все зарегистрированные пользователи могут загружать, как я могу безопасно управлять этим? Изображение загружается через хранилище firebase, а затем URL-адрес сохраняется в Firestore. У меня есть два варианта:
- В Firestore добавляется URL-адрес, после чего изображение можно загружать. Преимущество этого заключается в том, что после добавления нового документа Firestore я могу предоставить пользователю разрешение на загрузку файла. Недостатком является то, что после добавления документа загрузка может завершиться неудачно. Это будет означать, что в Firestore есть URL-адрес без изображения в хранилище.
- Изображение загружается в хранилище, а затем добавляется документ Firestore. Преимущество этого заключается в том, что к каждому документу прикреплено изображение, но это также означает, что каждый пользователь может загружать любое изображение, которое он хочет, без моего контроля.
Я использую облачные функции firebase, но если я сначала добавляю документ, вызываются облачные функции, в то время как загрузка изображения может не завершиться. Каков наилучший способ решения этой проблемы?
Комментарии:
1. «Преимущество этого заключается в том, что после добавления нового документа Firestore я могу предоставить пользователю разрешение на загрузку файла». => Как вы планируете предоставить разрешение пользователю? Обратите внимание, что вы не можете прочитать Firestore DB в правилах облачного хранилища. Единственный способ, который я вижу, — это использование пользовательских утверждений, но для их распространения может потребоваться время.
Ответ №1:
Если вы думали, что можете добавить в пакетную операцию операцию добавления Firestore и операцию загрузки файлов Firebase Storage и убедиться, что обе операции завершены, поэтому вы можете получить согласованные данные, пожалуйста, обратите внимание, что это невозможно. Эти операции являются частью различных служб Firebase, и, к сожалению, на данный момент, когда я пишу этот ответ, вы не можете сделать их атомарными.
Насколько я знаю, ни один из продуктов Firebase не поддерживает транзакционные операции между продуктами. Чтобы решить эту проблему, вам придется вложить вызовы во время операций добавления / загрузки и обработать ошибку, если вторая операция завершится неудачно. Это означает, что вам придется либо удалить документ из Firestore, если операция загрузки в облачное хранилище завершится неудачно, либо наоборот.
Но обратите внимание, что в какой-то момент времени произойдет сбой, из-за которого клиент не сможет откатить одну из операций удаления. Наиболее распространенный подход к этим неизбежным сбоям, которые могут произойти, заключается в том, чтобы сделать ваш код надежным, обрабатывая исключения и выполняя периодические очистки в обоих местах, Firestore и Firebase Storage.
Ответ №2:
Вы можете настроить утверждение авторизации пользователя, например «can_upload_pics», а затем проверять это утверждение всякий раз, когда пользователь инициирует загрузку, возможно, вы захотите использовать функции firebase для добавления пользовательских утверждений. Если все сделано правильно, второй вариант будет работать так, как ожидалось, посмотрите это видео для хорошего объяснения и примера пользовательских утверждений