Javascript 在断开连接时与firebase发生本机反应
我构建react本机应用程序,并尝试在用户关闭应用程序时生成事件,因此它会在firebase中将状态更新为“脱机”。 我所做的是Javascript 在断开连接时与firebase发生本机反应,javascript,reactjs,firebase,react-native,google-cloud-firestore,Javascript,Reactjs,Firebase,React Native,Google Cloud Firestore,我构建react本机应用程序,并尝试在用户关闭应用程序时生成事件,因此它会在firebase中将状态更新为“脱机”。 我所做的是 import React, { Component } from 'react' import Router from './src/Router' import firebase from 'react-native-firebase'; export default class App extends Component { constructo
import React, { Component } from 'react'
import Router from './src/Router'
import firebase from 'react-native-firebase';
export default class App extends Component {
constructor(props){
super(props)
this.state = {
uid: '',
userStatusDatabaseRef :'',
userStatusFirestoreRef: ''
}
}
componentWillMount() {
firebase.auth().signInAnonymouslyAndRetrieveData().then((user) => {
var uid = firebase.auth().currentUser.uid;
console.log('uid', uid)
var userStatusDatabaseRef = firebase.database().ref('status/' + uid);
var isOfflineForDatabase = {
state: 'offline',
last_changed: firebase.database.ServerValue.TIMESTAMP,
};
var isOnlineForDatabase = {
state: 'online',
last_changed: firebase.database.ServerValue.TIMESTAMP,
};
var userStatusDatabaseRef = firebase.database().ref('status/' + uid);
var userStatusFirestoreRef = firebase.firestore().doc('status/' + uid);
var isOfflineForFirestore = {
state: 'offline',
last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};
var isOnlineForFirestore = {
state: 'online',
last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};
const connectedRef = firebase.database().ref(".info/connected");
connectedRef.on("value", function (snap) {
// validate if connection is established
if (snap.val() === true) {
// remove the user's record on the disconnect
userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(()=>{
userStatusFirestoreRef.set(isOnlineForFirestore);
})
// then request user to enter their name
} else {
userStatusFirestoreRef.set(isOfflineForFirestore);
}
});
this.setState({userStatusDatabaseRef,userStatusFirestoreRef,uid})
})
}
render() {
return <Router />
}
componentWillUnmount(){
var isOfflineForFirestore = {
state: 'offline',
last_changed: firebase.firestore.FieldValue.serverTimestamp(),
};
this.state.userStatusFirestoreRef.set(isOfflineForFirestore);
}
}
为什么不将firestore中的值也设置为“脱机”
userStatusDatabaseRef.onDisconnect().remove((error)=>{
userStatusDatabaseRef.set(isOfflineForFirestore); // it update only in firebase
userStatusFirestoreRef.set(isOfflineForFirestore);
})
一旦建立firebase
onDisconnect()
操作,该操作将在firebase实时服务器上启动。它检查用户是否可以执行写操作,如果无效,则为相同的操作传递回调
它还检查连接状态。当您的连接被客户端丢失或超时或故意关闭时,将调用该连接
问题的第二部分取决于导航的性质,组件umounts是否因此与服务器断开连接,或者它是否嵌套在同一服务器中
根据,您可以使用删除操作
确保在客户端断开连接时(由于关闭浏览器、导航到新页面或网络问题)删除此位置的数据
另外要注意的是
onDisconnect
操作仅触发一次。如果希望每次发生断开
操作,则需要在每次重新连接时重新建立断开操作如何查看其调用?当连接中断时,我不会被炒鱿鱼。。我正在寻找一种方法,在断开连接或用户关闭更新时回调并写入firebase,您可以使用删除来检查它,也可以检查注释。我根据您的建议更改了它,并且它仅在firebase中删除,我希望它在firestore中更新为“在Firebase中删除后脱机”检查您是否具有写入权限,以及文档是否存在userStatusFirestoreRef.set(IsoflineForFireStore,{merge:true})
以合并文档。
userStatusDatabaseRef.onDisconnect().remove((error)=>{
userStatusDatabaseRef.set(isOfflineForFirestore); // it update only in firebase
userStatusFirestoreRef.set(isOfflineForFirestore);
})
YourFireBaseRef.onDisconnect().remove((error) => {
// Do some stuff
});