正在发送消息:未定义的ID

时间:2020-02-25 10:42:49

标签: reactjs firebase react-native firebase-realtime-database react-native-android

我正在尝试创建一个简单的独立聊天室。我使用Firebase创建数据库,并在Fire.js上导入了引用。

但是,每当我尝试在“聊天”屏幕上发送消息时,都会弹出错误消息:

Error: Reference.push failed: first argument contains undefined in property 'messages.user._id

这是我的Chat.js中的代码:

import React from 'react';
import {Platform, KeyboardAvoidingView, SafeAreaView } from 'react-native';
import {GiftedChat} from 'react-native-gifted-chat';
import Fire from '../Fire';

export default class ChatScreen extends React.Component {
state ={
    messages: []
}

get user() {
    return{
        _id: Fire.uid,
        name: this.props.navigation.state.params.name
    };
}

componentDidMount() {
    Fire.get(message => 
        this.setState(previous => ({
            messages: GiftedChat.append(previous.messages, message)
        }))
    );
}

componentWillUnmount() {
    Fire.off();
}

  render(){
  const chat = <GiftedChat messages={this.state.messages} onSend={Fire.send} user={this.user}/>;
    if (Platform.OS === "android") {
        return( 
            <KeyboardAvoidingView style={{flex:1}} behavior='padding' keyboardVerticalOffset={30} enabled>
                {chat}
            </KeyboardAvoidingView>
        );
    }

  return <SafeAreaView style={{flex:1}}>{chat}</SafeAreaView>

  }
}

这是我的Fire.js中的代码:

import firebase from 'firebase';

class Fire{
constructor() {
    this.init()
    this.checkAuth()
}

init = () => {
    if (!firebase.apps.length) {
        firebase.initializeApp({

                //This is the reference to the Firebase data

        });
    }
};

checkAuth = () => {
    firebase.auth().onAuthStateChanged(user => {
        if (!user) {
            firebase.auth().signInAnonymously();
        }
    });
};

send = messages => {
    messages.forEach(item => {
        const message = {
            text: item.text,
            timestamp: firebase.database.ServerValue.TIMESTAMP,
            user: item.user
        };

        this.db.push(message);
    });
};

parse = message => {
    const {user, text, timestamp} = message.val();
    const {key: _id} = message;
    const createdAt = new Date(timestamp);

    return {
        _id,
        createdAt,
        text,
        user
    };
};

get = callback => {
    this.db.on("child_added", snapshot => callback(this.parse(snapshot)));
};

off() {
    this.db.off()
}

get db() {
    return firebase.database().ref("messages");
}

get uid() {
    return (firebase.auth().currentUser || {}).uid;
}
}

export default new Fire();

我不明白为什么会这样。你能帮我吗?

1 个答案:

答案 0 :(得分:0)

错误消息:

错误:Reference.push失败:第一个参数包含未定义的属性'messages.user._id

告诉您您的代码调用push():

        const message = {
            text: item.text,
            timestamp: firebase.database.ServerValue.TIMESTAMP,
            user: item.user
        };

        this.db.push(message);

正在传递包含message.user._id中未定义的对象。由于我们看不到item.user中的内容,因此我们无法为您诊断出这一点,因此您将需要弄清楚为什么会发生这种情况。

最重要的是,Firebase SDK不允许您编写属性包含未定义的对象,而您需要在代码中进行检查。