【问题标题】:Error - Firebase.push failed:错误 - Firebase.push 失败:
【发布时间】:2016-09-30 17:40:47
【问题描述】:

我正在尝试将一组问题和相关选项推送到名为“测验”的 Firebase 参考。单击提交时,我在控制台中得到以下信息。

Uncaught Error: Firebase.push failed: first argument contains an invalid key ($$typeof) in property 'quizzes.questions.0'. Keys must be non-empty strings and can't contain ".", "#", "$", "/", "[", or "]"

我不知道($$typeof) 在这里是什么意思,也不知道如何解决这个问题。我将 Option 组件推入 Question 组件数组 [ ],然后将 question 组件推入 QuizBuilderForm 数组 [ ]。

谢谢!

这是我的代码

// Quiz Builder Component

import React from 'react';
import Question from './Question';
import firebase from 'firebase';

const QuizBuilderForm = React.createClass({
    getInitialState: function() {
        return {
            questions: [],
        };
    },
    addQuestion: function(questions, index) {
        index = this.state.questions.length;
        questions = this.state.questions;
        questions.push(<Question key={index} id={index}/>);
        index++;
        this.setState({
            questions: questions
        });
    },
    componentDidMount: function() {
        this.addQuestion();
    },
    handleSubmit: function(event) {
        event.preventDefault();
        this.firebaseRef = firebase.database().ref('quizzes');
        this.firebaseRef.push({
            questions: this.state.questions
        });
        this.refs.form.reset();
        this.setState({
            questions: []
        });
    },
    render: function() {
        return (
            <form className="quiz-form" onSubmit={this.handleSubmit} ref="form">
                {this.state.questions}
                <button type="button" className="add-question" onClick={this.addQuestion}>Add a question</button>
                <button type="submit">Create Quiz</button>
            </form>      
        );
    }
});

export default QuizBuilderForm;

// Question Component 

import React from 'react';
import Option from './Option';

const Question = React.createClass({
    getInitialState: function() {
        return {
            value: "",
            options: []
        };
    },
    handleChange: function(e) {
        this.setState({
           value: e.target.value 
        });
    },
    addOption: function(options, index) {
        index = this.state.options.length;
        options = this.state.options;
        options.push(<Option key={index} id={index} />);
        index++;
        this.setState({
            options: options

        });
    },
    componentDidMount: function() {
        this.addOption();
    },
    render: function() {
        return (
            <div className="question">
                <input type="text" value={this.state.value} onChange={this.handleChange}></input>
                {this.state.options}
                <button type="button" onClick={this.addOption}>Add another option</button>
            </div>
        );
    }
});

export default Question;

// Options component 

import React from 'react';

const Option = React.createClass({
    getInitialState: function() {
        return {
            value: ""
        };
    },
    handleChange: function(e) {
        this.setState({
            value: e.target.value
        });
    },
    render: function() {
        return (
            <input type="text" value={this.state.value} placeholder="Enter an answer here" onChange={this.handleChange}></input>        
        );
    }
});

export default Option;

【问题讨论】:

  • 尝试在 push() 事件之前记录 this.state.questions 的内容。你会发现这是一个 React 组件,并且包含以 $ 和 $$ 开头的特殊键。 Firebase 键中不允许使用这些字符,因此它被拒绝,如错误所示。您需要将该数据解析为有效的 JSON 和匹配 Firebase 允许架构的键——您将无法像您在此处尝试的那样将 React 对象直接保存到数据库中。查看reactfire 以获得更简单的集成。
  • 感谢您的回复。我想我不太确定如何解析数据。我不是很熟悉。我认为我卡住的地方是我正在动态添加输入字段,我不确定获取每个动态添加的输入字段值的好方法,以便我可以将其添加到 Firebase。显然,这是一个静态形式的小菜一碟,只需抓住裁判,但对我来说,动态形式非常具有挑战性。那里有什么建议吗?谢谢!

标签: reactjs firebase firebase-realtime-database


【解决方案1】:

我在您的代码中发现了 2 个主要错误。

  1. 您正在尝试在 firebase 上推送一个无法正常工作的 react 组件。您需要推送一个字符串数组或对象数组。

  2. 您正在尝试将子组件设置为父组件的状态变量。你不应该那样做。您需要将要显示的数据设置为组件的状态,然后将此数据传递给您的子组件,让子组件决定如何呈现。

【讨论】:

  • 好的。 1号是有道理的。我想我并没有真正期望它能够工作我只是不确定如何将我的数组转换为字符串或对象。您对如何解决这个问题有什么建议吗?
  • 你要保存的数据应该是你父组件的状态变量。在你的情况下,它应该是这样的。 var data = [{ value : "", options:["", "", "", ""] }];这应该生成 1 个带有四个选项的问题。如果你想添加一个新问题,你需要这样做。 this.state.data.push({ value : "", options:["", "", "", ""] });您需要遍历此数组并将数据作为道具发送给子组件,子组件应显示数据。希望这能给你一个方向。如果这没有帮助,我会给你代码。
  • 是的,这有帮助! !我会自己尝试,让你知道它是怎么回事。非常感谢。
猜你喜欢
  • 2013-07-14
  • 2017-05-12
  • 2016-08-21
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多