2016-09-30 3 views
0

질문 모음과 관련된 옵션을 '퀴즈'라는 firebase ref에 푸시하려고합니다. 제출을 클릭하면 콘솔에서 다음과 같이 표시됩니다.Error - Firebase.push failed :

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 구성 요소 배열 []로 푸시하고 질문 구성 요소를 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; 
+2

push() 이벤트 바로 전에 this.state.questions의 내용을 로깅 해보십시오. 이것은 React 구성 요소이며 $ 및 $$로 시작하는 특수 키를 포함합니다. 이러한 문자는 Firebase 키에 허용되지 않으므로 오류가 나타내는 것처럼 거부됩니다. 이 데이터를 유효한 JSON으로 분석하고 Firebase의 허용 스키마와 일치하는 키를 파싱해야합니다. 여기에서 시도한 것처럼 React 객체를 직접 DB에 저장할 수 없습니다. 더 쉬운 통합을 위해 [reactfire] (https://github.com/firebase/reactfire)를 확인하십시오. – Kato

+0

응답 해 주셔서 감사합니다. 나는 데이터를 파싱하는 방법을 모를 것이라고 생각한다. 나는별로 친숙하지 않다. 내가 갇혀있는 곳은 필자가 동적으로 입력 필드를 추가하는 것이고, 동적으로 추가 된 각 입력 필드 값을 잡아서 Firebase에 추가 할 수있는 좋은 방법이 확실치 않다. 분명히 이것은 정적 인 형태의 케이크 조각입니다. 그냥 ref를 잡아 줘야하지만 동적 인 형태로 나를 위해 꽤 도전적입니다. 거기에 어떤 제안? 감사! – maxwellgover

답변

1

내 코드입니다.

  1. 반응 할 구성 요소를 작동시킬 firebase에 밀어 넣으려고합니다. 문자열 배열이나 객체 배열을 푸시해야합니다.

  2. 상위 구성 요소의 상태 변수에 하위 구성 요소를 설정하려고합니다. 당신은 그렇게해서는 안됩니다. 표시 할 데이터를 구성 요소의 상태로 설정 한 다음이 데이터를 하위 구성 요소에 전달하고 하위 구성 요소가 렌더링 방법을 결정하도록해야합니다.

+0

확인. 1 번 의미가 있습니다. 나는 그것이 정말로 작동 할 것으로 기대하지 않는다고 생각합니다. 배열을 문자열이나 객체로 변환하는 방법을 모르겠습니다. 이 문제를 해결하는 방법에 대한 권장 사항이 있습니까? – maxwellgover

+0

저장하려는 데이터는 상위 구성 요소의 상태 변수 여야합니다. 당신의 경우에는 이렇게되어야합니다. var data = [{ 값 : "", 옵션 : [ "" "" "", ""] ]]; 이렇게하면 네 가지 옵션과 함께 1 개의 질문이 생성됩니다. 새 질문을 추가하려면이 작업을 수행해야합니다. this.state.data.push ({ 값 : "", 옵션 : [ "" "" "", ""] }); 이 배열을 반복하고 데이터를 하위 구성 요소에 props로 보내야하며 하위 구성 요소가 데이터를 표시해야합니다. 희망 사항은 당신에게 방향을 제시합니다. 이것이 도움이되지 않으면 나는 당신에게 코드를 줄 것이다. – Arpit

+0

그게 도움이됩니다! ! 나는 스스로 시험해보고 그것이 어떻게되는지 알려줄 것입니다. 고마워. – maxwellgover

관련 문제