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: json
jQuery가 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/json
HTML을 응답으로받을 때 발생합니다 . 기본적으로 이것은 JSON 응답으로 특정 URL에 대한 서버 측 스크립트를 작성할 때 발생하지만 오류 형식은 HTML입니다.