javascript - 与 firebase onDisconnect react native

标签 javascript reactjs firebase react-native google-cloud-firestore

我构建了 React native 应用程序,并尝试在用户关闭应用程序时创建事件,因此它在 firebase 中将状态更新为“离线”。 我做的是

    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);

    }
}

首先,我想了解 onDisconnect 何时触发以及做什么。其次,当我导航到其他屏幕时,它会触发我,这不是我要找的,只有当用户从每个屏幕关闭应用程序时。我不想复制代码并写入每个组件,因为它不是正确的编码。我正在从每个屏幕/组件中寻找事件,用户可以离线或在线在 firebase 中更新

我更改了我的代码,它只在 firebase 而不是 firestore 中更新

 const connectedRef = firebase.database().ref(".info/connected");

            // validate if connection is established
            if (snap.val() === true) {
                userStatusFirestoreRef.set(isOnlineForDatabase);
                userStatusDatabaseRef.set(isOnlineForDatabase)

                // remove the user's record on the disconnect
                userStatusDatabaseRef.onDisconnect().remove((error)=>{
                    userStatusDatabaseRef.set(isOfflineForFirestore);
                    userStatusFirestoreRef.set(isOfflineForFirestore);

                })
                // then request user to enter their name
            } else {

                userStatusFirestoreRef.set(isOfflineForFirestore);

            }
        });

为什么不将 firestore 中的值也设置为“离线”

 userStatusDatabaseRef.onDisconnect().remove((error)=>{
                    userStatusDatabaseRef.set(isOfflineForFirestore); // it update only in firebase
                    userStatusFirestoreRef.set(isOfflineForFirestore);

                })

最佳答案

一旦您建立了一个 firebase onDisconnect() 操作,该操作就会在 FireBase RealTime Sever 上启动。它会检查您的用户是否可以执行写操作并在无效时传递相同的回调。

它还会检查连接状态。当您的连接丢失或超时或客户端故意关闭时,将调用连接。

问题的第二部分取决于导航的性质,组件是否卸载从而与服务器断开连接,或者它是否嵌套在同一服务器内

根据docs ,您可以使用删除操作

确保在客户端断开连接(由于关闭浏览器、导航到新页面或网络问题)时删除此位置的数据

 YourFireBaseRef.onDisconnect().remove((error) => {
      // Do some stuff
    });

还有一点需要注意的是

onDisconnect 操作只触发一次。如果您希望每次发生断开连接时都发生操作,则需要在每次重新连接时重新建立onDisconnect 操作

关于javascript - 与 firebase onDisconnect react native ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49866427/

相关文章:

javascript - JQuery 函数做某事 - 暂停 - 做其他事

javascript - 更改css文件中的div样式

javascript - ZK:如何使用 JavaScript 在客户端填充 zk 组合框

javascript - React 和 Electron 与 Bablify : Uncaught TypeError: fs. readFileSync 不是一个函数

关闭应用程序时未收到 Android FCM 推送通知

Firebase云功能更改事件时间戳错误

javascript - 如何在Android中注入(inject)一个可以作为构造函数调用的JS对象?

javascript - 警告 : setState(. ..):无法在使用 redux/immutable 的现有状态转换期间更新

reactjs - react 继电器: Adding data to edges

node.js - 获取用户 ID 后,Firebase 函数 onCreate 方法无法在 Firestore 上运行