Использование Object.assign при обновлении полей документа с помощью Firebase - PullRequest
1 голос
/ 10 октября 2019

Я делаю сайт, где пользователи могут создавать новые проекты. Для создания проекта пользователям необходимо заполнить форму со всей информацией о проекте. Внутри этой формы находится поле ввода файла, пользователи могут выбирать изображения и документы с этим. Мой код проходит через все файлы и сохраняет их в хранилище Firebase. Эта часть кода работает отлично, за исключением той части, где я пытаюсь заполнить поля документа этими данными.

Я попробовал это, используя Object.assign() внутри Firebase .update(). Всякий раз, когда этот фрагмент кода запускается, он выдает эту ошибку:

Функция DocumentReference.update () вызвана с неверными данными. Неподдерживаемое значение поля: пользовательский объект File (находится в изображении поля)

Я знаю, что проблема Object.assign здесь, потому что она работает без него. Буду признателен, если кто-нибудь сможет мне помочь с этой проблемой.

Это часть кода, которая выдает ошибку:

firestore.collection('projects').doc(res.id)
    .update(Object.assign(this.values, {
        createdAt: new Date(),
        updatedAt: new Date(),
        createdBy: '/users/' + firebaseApp.auth().currentUser.email,
        approved: false
    }))
    .then(res => {
       console.log(res)
       this.$toast.success('Project changes saved', { icon: 'mdi-check-bold' })
     }).catch((err) => {
         this.$toast.error(err.message, { icon: 'mdi-alert-circle' })
         console.log(err)
       })

Это функция, которую я вызываю при отправке:

submit () {
  this.overlay = true

      firestore.collection('projects').add({})
          .then((res) => {
            Promise.all(
              fileKeys.map((key, index) => {
                return new Promise((resolve, reject) => {
                  if (!this.values[key]) {
                    resolve(this.values[key])
                  } else {
                    if (typeof this.values[key][0] === 'undefined') {
                      const file = this.values[key]
                      const ref = storage.ref(`/projects/${res.id}/${file.name}`)

                      this.uploadHandler(file, ref, index).then((downloadURL) => {
                        if (downloadURL) {
                          this.values[key] = {
                            url: downloadURL,
                            fullPath: ref.fullPath,
                            name: file.name || '',
                            size: file.size || '',
                            type: file.type || ''
                          }

                          resolve(this.values[key])
                        } else {
                          reject()
                        }
                      })

                    } else {
                      const fileCollection = [];

                      Promise.all(
                        (this.values[key]).map((file) => {
                          return new Promise((resolve, reject) => {
                            const ref = storage.ref(`/projects/${res.id}/${file.name}`)

                            this.uploadHandler(file, ref, index).then((downloadURL) => {
                              if (downloadURL) {
                                fileCollection.push({
                                  url: downloadURL,
                                  fullPath: ref.fullPath,
                                  name: file.name || '',
                                  size: file.size || '',
                                  type: file.type || '',
                                  height: '',
                                  width: ''
                                })
                              }

                              resolve(downloadURL)
                            }).catch((e) => {
                              reject(e)
                            })
                          })
                        })
                      ).then(() => {
                        this.values[key] = fileCollection.length > 0 ? fileCollection : null
                        resolve(fileCollection)
                      })
                    }
                  }
                })
              })
            )
            firestore.collection('projects').doc(res.id).update(Object.assign(this.values, { createdAt: new Date(), updatedAt: new Date(), createdBy: '/users/' + firebaseApp.auth().currentUser.email, approved: false }))
              .then(res => {
              console.log(res)
              this.$toast.success('Project changes saved', { icon: 'mdi-check-bold' })
            }).catch((err) => {
              this.$toast.error(err.message, { icon: 'mdi-alert-circle' })
              console.log(err)
            })
          }).catch((err) => {
            console.log(err)
            console.log('error')
          })
        },

1 Ответ

0 голосов
/ 10 октября 2019

В сообщении об ошибке сообщается, что объект, который вы передали update(), содержит объект File в качестве одного из своих свойств, что недопустимо. Вы должны передавать в Firestore только те объекты, которые имеют общие типы JavaScript, или метки времени, или DocumentReferences.

Это, вероятно, означает, что this.values содержит хотя бы один объект File до вызова Object.assign(). (Код довольно сложен для отслеживания, поэтому я не могу сразу увидеть, что это может быть.) Вместо этого вам нужно будет убедиться, что вы составляете объект, который не содержит объектов File. Если вы намеревались сохранить загруженный файл в Cloud Firestore, это, вероятно, в любом случае не очень хорошая идея, поскольку вы можете легко превысить максимальный размер документа 1 МБ.

...