我正在建立一个网站,用户可以在其中创建新项目。要创建项目,用户必须使用所有项目信息填写表单。在此表单的内部是文件输入字段,用户可以由此选择图像和文档。我的代码遍历所有文件,并将它们存储在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')
})
},
答案 0 :(得分:0)
错误消息告诉您,传递给update()
的对象包含File对象作为其属性之一,这是不被接受的。您只应将具有常见JavaScript类型,时间戳或DocumentReferences的对象传递给Firestore。
这可能意味着this.values
在调用Object.assign()
之前至少包含一个File对象。 (该代码很难理解,因此我无法立即看到可能的结果。)相反,您必须做的是确保正在编写一个不包含File对象的对象。如果您打算将上传的文件存储在Cloud Firestore中,那么这可能不是一个好主意,因为您很容易会超过1MB的最大文档大小。