[javascript] “SyntaxError : JSON의 0 위치에 예기치 않은 토큰 <“

Facebook과 같은 콘텐츠 피드를 처리하는 React 앱 구성 요소에서 오류가 발생했습니다.

Feed.js : 94 undefined “parsererror” “SyntaxError : JSON에서 0 위치의 예기치 않은 토큰 <

비슷한 오류가 발생하여 렌더링 함수 내에서 HTML의 오타로 판명되었지만 여기서는 그렇지 않습니다.

더 혼란스럽게도 코드를 이전의 알려진 작동 버전으로 롤백했는데 여전히 오류가 발생합니다.

Feed.js :

import React from 'react';

var ThreadForm = React.createClass({
  getInitialState: function () {
    return {author: '',
            text: '',
            included: '',
            victim: ''
            }
  },
  handleAuthorChange: function (e) {
    this.setState({author: e.target.value})
  },
  handleTextChange: function (e) {
    this.setState({text: e.target.value})
  },
  handleIncludedChange: function (e) {
    this.setState({included: e.target.value})
  },
  handleVictimChange: function (e) {
    this.setState({victim: e.target.value})
  },
  handleSubmit: function (e) {
    e.preventDefault()
    var author = this.state.author.trim()
    var text = this.state.text.trim()
    var included = this.state.included.trim()
    var victim = this.state.victim.trim()
    if (!text || !author || !included || !victim) {
      return
    }
    this.props.onThreadSubmit({author: author,
                                text: text,
                                included: included,
                                victim: victim
                              })
    this.setState({author: '',
                  text: '',
                  included: '',
                  victim: ''
                  })
  },
  render: function () {
    return (
    <form className="threadForm" onSubmit={this.handleSubmit}>
      <input
        type="text"
        placeholder="Your name"
        value={this.state.author}
        onChange={this.handleAuthorChange} />
      <input
        type="text"
        placeholder="Say something..."
        value={this.state.text}
        onChange={this.handleTextChange} />
      <input
        type="text"
        placeholder="Name your victim"
        value={this.state.victim}
        onChange={this.handleVictimChange} />
      <input
        type="text"
        placeholder="Who can see?"
        value={this.state.included}
        onChange={this.handleIncludedChange} />
      <input type="submit" value="Post" />
    </form>
    )
  }
})

var ThreadsBox = React.createClass({
  loadThreadsFromServer: function () {
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      cache: false,
      success: function (data) {
        this.setState({data: data})
      }.bind(this),
      error: function (xhr, status, err) {
        console.error(this.props.url, status, err.toString())
      }.bind(this)
    })
  },
  handleThreadSubmit: function (thread) {
    var threads = this.state.data
    var newThreads = threads.concat([thread])
    this.setState({data: newThreads})
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      type: 'POST',
      data: thread,
      success: function (data) {
        this.setState({data: data})
      }.bind(this),
      error: function (xhr, status, err) {
        this.setState({data: threads})
        console.error(this.props.url, status, err.toString())
      }.bind(this)
    })
  },
  getInitialState: function () {
    return {data: []}
  },
  componentDidMount: function () {
    this.loadThreadsFromServer()
    setInterval(this.loadThreadsFromServer, this.props.pollInterval)
  },
  render: function () {
    return (
    <div className="threadsBox">
      <h1>Feed</h1>
      <div>
        <ThreadForm onThreadSubmit={this.handleThreadSubmit} />
      </div>
    </div>
    )
  }
})

module.exports = ThreadsBox

Chrome 개발자 도구에서이 기능에서 오류가 발생하는 것 같습니다.

 loadThreadsFromServer: function loadThreadsFromServer() {
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      cache: false,
      success: function (data) {
        this.setState({ data: data });
      }.bind(this),
      error: function (xhr, status, err) {
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  },

선으로 console.error(this.props.url, status, err.toString()밑줄.

오류가 서버에서 JSON 데이터를 가져 오는 것과 관련이있는 것처럼 보이므로 빈 DB에서 시작했지만 오류가 지속됩니다. React가 지속적으로 서버에 연결하려고 시도하고 결국 브라우저와 충돌하기 때문에 오류가 무한 루프에서 호출 된 것 같습니다.

편집하다:

Chrome 개발 도구 및 Chrome REST 클라이언트를 사용하여 서버 응답을 확인했으며 데이터가 올바른 JSON 인 것으로 보입니다.

편집 2 :

의도 한 API 엔드 포인트가 실제로 올바른 JSON 데이터 및 형식을 리턴하지만 React가 http://localhost:3000/?_=1463499798727예상 된 것 대신 폴링하는 것 같습니다 http://localhost:3001/api/threads.

백엔드 데이터를 반환하기 위해 포트 3001에서 실행되는 express 앱으로 포트 3000에서 웹팩 핫 리로드 서버를 실행하고 있습니다. 여기서 실망스러운 것은 이것이 내가 마지막으로 작업했을 때 올바르게 작동했으며 깨뜨릴 수있는 것을 찾을 수 없다는 것입니다.



답변

오류 메시지의 문구는를 실행할 때 Chrome에서받는 내용과 일치합니다 JSON.parse('<...'). 서버가 설정되었다고 말 Content-Type:application/json했지만 응답 본문 이 실제로 HTML 이라고 믿게되었습니다 .

Feed.js:94 undefined "parsererror" "SyntaxError: Unexpected token < in JSON at position 0"

선으로 console.error(this.props.url, status, err.toString())밑줄.

err실제로 내 던져진 jQuery변수로 당신에게, 그리고 전달 err. 줄에 밑줄이 그어진 이유는 단순히 그 줄을 기록하고 있기 때문입니다.

나는 당신이 당신의 로깅에 추가하는 것이 좋습니다. xhr응답에 대한 자세한 내용은 실제 (XMLHttpRequest) 속성을 확인하십시오. 추가를 시도하면 console.warn(xhr.responseText)수신되는 HTML이 표시 될 것입니다.


답변

서버에서 HTML (또는 XML)을 다시 수신하고 있지만 dataType: jsonjQuery가 JSON으로 구문 분석하도록 지시합니다. 서버의 응답 내용을 보려면 Chrome 개발 도구에서 “네트워크”탭을 확인하십시오.


답변

이것은 결국 권한 문제가되었습니다. cancan으로 인증하지 않은 URL에 액세스하려고했기 때문에 URL이로 변경되었습니다 users/sign_in. 리디렉션 된 URL은 json이 아닌 html에 응답합니다. html 응답의 첫 번째 문자는 <입니다.


답변

토큰 ‘m’이 다른 문자 일 수있는 “SyntaxError : JSON의 예기치 않은 토큰 m 위치”오류가 발생했습니다.

{ “name :”math “}와 같이 DB 테스트에 RESTconsole을 사용할 때 JSON 객체에서 큰 따옴표 중 하나를 놓쳤습니다. {“name : “math”}, 올바른 것은 { “name”: “math”} 여야합니다.

이 서투른 실수를 알아 내려면 많은 노력이 필요했습니다. 다른 사람들이 비슷한 범퍼를 겪을 까봐 두렵습니다.


답변

필자의 경우이 실행중인 웹 팩을 얻었고 로컬 node_modules 디렉토리의 어딘가에 손상이있는 것으로 나타났습니다.

rm -rf node_modules
npm install

… 다시 제대로 작동 할만큼 충분했습니다.


답변

필자의 경우 오류는 반환 값을 변수에 할당하지 않은 결과였습니다. 다음과 같은 오류 메시지가 발생했습니다.

return new JavaScriptSerializer().Serialize("hello");

나는 그것을 다음과 같이 바꿨다.

string H = "hello";
return new JavaScriptSerializer().Serialize(H);

변수가 없으면 JSON이 데이터를 올바르게 형식화 할 수 없습니다.


답변

이 오류는 응답을 정의하고 application/jsonHTML을 응답으로받을 때 발생합니다 . 기본적으로 이것은 JSON 응답으로 특정 URL에 대한 서버 측 스크립트를 작성할 때 발생하지만 오류 형식은 HTML입니다.