yamoo9 / likelion-FEQA

질문/답변 — 프론트엔드 스쿨, 멋사
29 stars 9 forks source link

[LAB-9] 파이어베이스 문서 전송 시 기초 값으로 들어가는 문제 #208

Closed qorbaxk closed 1 year ago

qorbaxk commented 1 year ago

질문 작성자

백승연

문제 상황

프로젝트 저장소 URL

환경 정보

yamoo9 commented 1 year ago

문제 상황

Cloud Storage에 업로드 된 이미지를 UI에 정상적으로 반영하고 싶습니다.

문제 해결

먼저 정상적으로 처리되는 UI 화면을 확인하세요. 😊

SubmitDiary.tsx 파일에 작성된 onSubmit 함수를 아래와 같이 수정하면 정상 작동할 것입니다. 코드 해설은 포함된 주석을 참고하세요. 😉

SubmitDiary.tsx

const onSubmit = async () => {
  const createTime = moment().format('YYYYMMDDHHmmss')

  // imgGroup 배열 데이터를 순환해 Promise 객체를 포함한 배열을 imageGroupPromises에 반환
  const imageGroupPromises = imgGroup.map(file => {
    const imgName = file.id
    const imagesRef = ref(storageService, `diaryImg/${userUid}/${imgName}`)

    // Promise 객체 반환
    // uploadString 함수를 사용해 Storage에 이미지 업로드
    return uploadString(imagesRef, file.origin, 'data_url')
      // 이미지 업로드가 완료되면 다운로드 URL 값을 가져와 반환
      .then(response => getDownloadURL(response.ref))
      // 응답 받은 다운로드 URL 값을 포함한 객체 반환
      .then(imgUrl => ({ id: imgName, url: imgUrl }))
  })

  // imageGroupPromises 배열(Promise 객체를 아이템으로 포함)을 전달받은 
  // Promise.all 메서드는 모든 비동기 처리가 완료될 때 then 함수가 실행됩니다.
  Promise.all(imageGroupPromises)
    // 요청이 성공하면 then 메서드 실행
    // imageUrls 배열을 전달 받아 diaryInfoObj 객체 반환
    .then(imageUrls => ({
      ...diary,
      user: userUid,
      createTime: createTime,
      id: new Date().getTime(),
      imagesUrl: imageUrls,
    }))
    // 반환된 diaryInfoObj 객체를 Firestore에 저장
    .then(diaryInfoObj => {
      addDoc(collection(dbService, 'diaryInfo'), diaryInfoObj)
    })
    // 오류가 발생한 경우 오류 처리
    .catch(error => {
      console.error('Error adding document:', error)
    })
    // 최종적으로 다이어리 초기화 및 /story 라우트로 이동
    .finally(() => {
      dispatch(resetDiary())
      navigate('/story')
    })
}

가이드 파일

가이드 파일을 다운로드 받아 확인해보세요. 😃

withPet-confirm-by-yamoo9.zip

qorbaxk commented 1 year ago

와.. 저렇게 promise 사용해서 순차적으로 진행해주면 되는거였군요 ㅠㅠ 뭔가 순서를 만들어줘야 할 것 같기는 했는데 이렇게 보니까 속이 시원하네요.. 감사합니다.