在处理类似Facebook内容提要的React应用程序组件中,我遇到了一个错误:
Feed.js:94未定义的“parsererror”语法错误:JSON中位于位置0的意外标记<
我遇到了一个类似的错误,结果是在render函数中的HTML中出现了一个输入错误,但这里的情况似乎不是这样
更让人困惑的是,我将代码回滚到了一个已知的早期工作版本,但仍然得到了错误
Feed.js:
从“React”导入React;
var ThreadForm=React.createClass({
getInitialState:函数(){
返回{作者:“”,
文本:“”,
包括:'',
受害者:“”
}
},
handleAuthorChange:函数(e){
this.setState({author:e.target.value})
},
handleTextChange:函数(e){
this.setState({text:e.target.value})
},
HandleIncludeChange:函数(e){
this.setState({包括:e.target.value})
},
handleVictimChange:函数(e){
this.setState({牺牲品:e.target.value})
},
handleSubmit:函数(e){
e、 预防默认值()
var author=this.state.author.trim()
var text=this.state.text.trim()
var included=this.state.included.trim()
var-victor=this.state.victor.trim()
如果(!text | | |!作者| |!包括| |!受害者){
回来
}
this.props.onThreadSubmit({作者:作者,
文本:文本,
包括:包括,,
受害者:受害者
})
此.setState({作者:“”,
文本:“”,
包括:'',
受害者:“”
})
},
渲染:函数(){
返回(
<;form className=“threadForm”onSubmit={this.handleSubmit}>;
<;输入
type=“text”
占位符=“您的姓名”
值={this.state.author}
onChange={this.handleAuthorChange}/>;
<;输入
type=“text”
占位符=“说点什么…”
值={this.state.text}
onChange={this.handleTextChange}/>;
<;输入
type=“text”
占位符=“说出受害者的名字”
值={this.state.牺牲品}
onChange={this.handleVictimChange}/>;
<;输入
type=“text”
占位符=“谁能看到?”
值={this.state.included}
onChange={this.handleIncludedChange}/>;
<;输入type=“submit”value=“Post”/>;
<;/form>;
)
}
})
var ThreadsBox=React.createClass({
loadThreadsFromServer:函数(){
$.ajax({
url:this.props.url,
数据类型:“json”,
cache:false,
成功:功能(数据){
this.setState({data:data})
}.绑定(此),
错误:函数(xhr、状态、错误){
console.error(this.props.url,status,err.toString())
}.绑定(此)
})
},
HandletThreadSubmit:函数(线程){
var threads=this.state.data
var newThreads=threads.concat([thread])
this.setState({data:newThreads})
$.ajax({
url:this.props.url,
数据类型:“json”,
键入:“POST”,
数据:线程,
成功:功能(数据){
this.setState({data:data})
}.绑定(此),
错误:函数(xhr、状态、错误){
this.setState({data:threads})
console.error(this.props.url,status,err.toString())
}.绑定(此)
})
},
getInitialState:函数(){
返回{data:[]}
},
componentDidMount:函数(){
this.loadThreadsFromServer()
setInterval(this.loadThreadsFromServer、this.props.pollInterval)
},
渲染:函数(){
返回(
<;div className=“threadsBox”>;
<;h1>;馈送<;/h1>;
<;div>;
<;ThreadForm onThreadSubmit={this.handleThreadSubmit}/>;
<;/div>;
<;/div>;
)
}
})
module.exports=ThreadsBox
在Chrome developer tools中,错误似乎来自此函数:
loadThreadsFromServer:函数loadThreadsFromServer(){
$.ajax({
url:this.props.url,
数据类型:“json”,
cache:false,
成功:功能(数据){
this.setState({data:data});
}.绑定(此),
错误:函数(xhr、状态、错误){
console.error(this.props.url,status,err.toString());
}.绑定(此)
});
},
行console.error(this.props.url,status,err.toString()带下划线
由于错误似乎与从服务器提取JSON数据有关,我尝试从一个空白数据库开始,但错误仍然存在。错误似乎是在无限循环中调用的,可能是React不断尝试连接到服务器,最终导致浏览器崩溃
编辑:
我已经用Chrome开发工具和Chrome REST客户端检查了服务器响应,数据似乎是正确的JSON
编辑2:
看起来,尽管预期的API端点确实返回了正确的JSON数据和格式,但React正在轮询http://localhost:3000/?_=1463499798727而不是预期的http://localhost:3001/api/threads
我正在端口3000上运行一个webpack热加载服务器,在端口3001上运行express应用程序以返回后端数据。令人沮丧的是,上次我使用它时,它工作正常,找不到可以更改的内容来破坏它
错误消息的措辞与您在运行JSON.parse(“<;…”)时从Google Chrome获得的内容相对应。我知道您说过服务器正在设置内容类型:application/JSON,但我相信响应body实际上是HTML
Feed.js:94未定义的";语法错误";意外标记<;在JSON中的位置0";行
console.error(this.props.url,status,err.toString())加下划线
err实际上是在jQuery中抛出的,并作为变量err传递给您。该行加下划线的原因很简单,因为您正在记录它
我建议您添加到日志中。查看实际的xhr(XMLHttpRequest)属性以了解有关响应的更多信息。尝试添加console.warn(xhr.responseText),您很可能会看到接收到的HTML