我很难理解Firebase上传的整个令牌部分。
我只想上传使用化身,将它们保存到数据库中,然后在客户端读取它们。
const storageRef = firebase.storage().ref();
storageRef.child(`images/user-avatars/${user.uid}`).put(imageObj);
然后,在我的云函数中,我像这样获取新的URL:
exports.writeFileToDatabase = functions.storage.object().onFinalize(object => {
const bucket = defaultStorage.bucket();
const path = object.name as string;
const file = bucket.file(path);
return file
.getSignedUrl({
action: "read",
expires: "03-17-2100"
})
.then(results => {
const url = results[0];
const silcedPath = path.split("/");
return db
.collection("venues")
.doc(silcedPath[1])
.set({ images: FieldValue.arrayUnion(url) }, { merge: true });
});
});
我已在Google API平台中启用IAM
,并将Cloud functions service agent
添加到App Engine default service account
。
我感觉以前完全相同的配置已经起作用了,但是现在有时候它甚至不写新的URL,或者我得到403试图读取它。对于我做错的事情,我找不到任何解释或错误。
编辑:忘记添加这段代码,但是FieldValue
在文档顶部设置为
const FieldValue = admin.firestore.FieldValue;
您需要执行admin.firestore.FieldValue.arrayUnion(url)
而不是FieldValue.arrayUnion(url)
,请参阅doc。
因此下面的代码应该可以解决问题:
exports.writeFileToDatabase = functions.storage.object().onFinalize(object => {
const bucket = defaultStorage.bucket();
const path = object.name;
const file = bucket.file(path);
return file
.getSignedUrl({
action: "read",
expires: "03-17-2100"
})
.then(results => {
const url = results[0];
const silcedPath = path.split("/");
return admin.firestore()
.collection("venues")
.doc(silcedPath[1])
.set({ images: admin.firestore.FieldValue.arrayUnion(url) }, { merge: true });
});
});