我想保存" score ";变量的"hilicore"字段在我的云firestore数据库为我的用户,但变化只出现在我再次使用谷歌登录后。每次我登录时,即使我是用同一个google帐户登录,也会创建一个新文档。我这样做,同时更新一个标准集合,如"displayName"但是我设置的自定义集合是"hilicore_";永远无法更新,即使再次登录后也无法更新。我试过重新加载用户,但它不做任何事情。(我在vanilla.js中使用命名空间web版本8)
这是我的代码:
function gameOver () {
if (score > highscore) {
GAME_OVER_TEXT.innerText = 'New Highscore:';
HIGHSCORE.innerText = `${score} points.`;
STARS.classList.remove('hide');
SPARKLE.classList.remove('hide');
const user = firebase.auth().currentUser;
user.updateProfile({
highscore: score
}).then(() => {
console.log('Update successful');
}).catch((error) => {
console.log('Update unsuccessful' + error);
});
user.currentUser.reload();
} else {
GAME_OVER_TEXT.innerText = 'Your score:';
HIGHSCORE.innerText = `${score} points.`;
}
}
对reload
的调用立即从服务器加载当前配置文件。由于updateProfile
也是一个异步调用,因此您现在正在加载未更新的配置文件。要解决这个问题,必须在更新完成后重新加载配置文件。所以:
user.updateProfile({
highscore: score
}).then(() => {
console.log('Update successful');
user.currentUser.reload().then(() => {
console.log('Profile reloaded');
});
}).catch((error) => {
console.log('Update unsuccessful' + error);
});
注意updateProfile
只接受displayName
和photoURL
作为属性,因为您不能从Firebase客户端sdk在用户配置文件中存储其他信息。您可以使用Admin SDK(在服务器或其他可信环境上)使用该值设置自定义声明,或者(更可能在这里)将信息存储在自定义数据库中(例如Firestore或Realtime database,它们也是Firebase的一部分)。
这在之前已经讨论过很多次了,所以我建议您查看之前关于该主题的问题。