我正在将图像上传到firebase存储,并希望将它们的图像保存为firebase身份验证中的照片URL。然而,当我使用获得签名的URL后上传图像URL时,我收到错误
错误:照片URL字段必须是有效的URL。
我知道URL是有效的,因为我已经从控制台输出中检查了它。我尝试过使用decodeURI,甚至研究了firebase-admin-node
的源代码,一直跟踪到一个名为auth-api-requests.ts的文件,该文件在第252行检查名为validator.isURL(request.photoUrl)
的函数中的URL,这让我找到了定义该函数的文件validator.ts在第152行定义了.isURL()
字符。我不想篡改Firebase的源代码,但我找不到任何解决方案。应该有一个更简单的解决方案来将一个谷歌函数.getSignedURL()
的返回用作另一个.updateUser({photoURL:
}中的参数,特别是考虑到不能再从谷歌云函数节点调用firebase.getDownloadURL()
。感谢您为解决此问题提供的任何帮助。
var downloadURL = "";
await admin.storage().bucket("gs://****firebase.appspot.com").file(storageRef).getSignedUrl({"action":"read","expires":Date.now() + 500*365*24*3600000}).then((value) => {
console.log("value after requesting signed URL: " + JSON.stringify(value));
downloadURL = value;
return value;
}).catch((error) => {
console.log("error perfoming signed URL: " + error);
return error;
})
const url = decodeURI(downloadURL)
console.log("nThe decodeURI url: " + url + "n");
await admin.auth().updateUser(userID,{photoURL:url}).then((user) => {
console.log("User update ran a success: " + JSON.stringify(user));
return true;
}).catch((error) => {
console.log("An error occured in getting the user: " + error);
return error;
});
对用户的photoURL(仅为联合登录用户填充)进行硬编码不是一个好主意,因为它可能会更改。换句话说,Twitter用户可能会更改他们的个人资料照片。firebase.auth()
在用户登录时为您提供新的用户元数据。
它只会增加维护开销来保存这种类型的元数据——不需要为此而烦恼。
您应该使用Authenticated URL,它绝对是一个有效的URL,而不是gsutil URI-gs://~
https://storage.cloud.google.com/${PROJECT_ID}.appspot.com/${pathToFile}