使用Firebase更新文档字段时使用Object.assign

时间:2019-10-10 12:47:19

标签: javascript firebase vue.js google-cloud-firestore firebase-storage

我正在建立一个网站,用户可以在其中创建新项目。要创建项目,用户必须使用所有项目信息填写表单。在此表单的内部是文件输入字段,用户可以由此选择图像和文档。我的代码遍历所有文件,并将它们存储在Firebase存储中。除了我试图用该数据填充文档字段的那一部分之外,该代码的那一部分工作正常。

我在Firebase Object.assign()内使用.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 :(得分:0)

错误消息告诉您,传递给update()的对象包含File对象作为其属性之一,这是不被接受的。您只应将具有常见JavaScript类型,时间戳或DocumentReferences的对象传递给Firestore。

这可能意味着this.values在调用Object.assign()之前至少包含一个File对象。 (该代码很难理解,因此我无法立即看到可能的结果。)相反,您必须做的是确保正在编写一个不包含File对象的对象。如果您打算将上传的文件存储在Cloud Firestore中,那么这可能不是一个好主意,因为您很容易会超过1MB的最大文档大小。