javascript - 删除/onDisconnect 在注销时不起作用
问题描述
使用文档,我创建了以下存在函数:
function setPresence() {
var myConnectionsRef = firebase.database().ref('users/' + currentUser.uid + '/connections');
var connectedRef = firebase.database().ref('.info/connected');
connectedRef.on('value', function(snap) {
if (snap.val() === true) {
var con = myConnectionsRef.push();
con.onDisconnect().remove();
con.set("profile");
}
});
}
我有基本的退出功能:
firebase.auth().signOut().then(() => {
// Sign-out successful.
}).catch((error) => {
// An error happened.
});
问题是 onDisconnect 在注销时似乎没有激活。我需要在他们注销时清除用户状态,但由于某种原因,我收到权限被拒绝错误:
使用this,当身份验证状态更改以致用户未定义时,我尝试了以下操作:
firebase.database().ref('users/' + currentUser.uid ).remove()
.then(function() {
console.log("Remove succeeded.");
window.location = "/";
})
.catch(function(error) {
console.log("Remove failed: " + error.message)
});
我正在使用基本的安全规则:
{
"rules": {
"users": {
"$uid": {
".read": "auth != null",
".write": "auth != null && auth.uid == $uid"
}
}
}
}
知道我做错了什么吗?
解决方案
从身份验证中注销用户与连接到实时数据库无关。虽然您的安全规则可能要求用户登录,但在产品级别没有这样的要求:许多应用程序允许未经身份验证的用户使用其部分数据。
.info/connected
侦听器是客户true
端可以连接到 Firebase 实时数据库服务器的时间,与他们是否可以访问该数据库中的特定数据无关。
您为连接定义的任何onDisconnect
处理程序都会在(服务器检测到)连接丢失时执行。这又与用户的登录状态无关。
如果您想在用户退出时将其标记为不再存在,您应该在退出之前删除他们的状态节点。因此,您firebase.database().ref('users/' + currentUser.uid ).remove()
需要在调用firebase.auth().signOut()
.
firebase.database().ref('users/' + currentUser.uid ).remove().then(() => {
firebase.auth().signOut().then(() => {
window.location = "/";
});
})
推荐阅读
- ios - 在我的应用程序中更新个人资料照片时,使用 firebase 为更新的个人资料照片生成新行
- json - 如何将日期插入 Web 路径 api
- c# - 将参数传递给 .NET Core API 中的自定义类
- scala - 如何定义一个 Scala 函数以在没有括号和点的情况下调用它
- python - Python散点图:无法连接点
- php - 如何在 SQL 上使用准备好的语句
- uisegmentedcontrol - 为什么旋转屏幕(Xcode 11 beta5)时 UISegmentedControl 中选定的段颜色变得清晰?
- azure-sql-database - ADFV2、VNET 和链接服务
- python - 在 Keras 中对 4D 数据执行 Conv2D
- android - 搜索过滤器不在列表视图中显示搜索到的项目