在一个React应用程序组件处理facebook类似的内容提要,我遇到了一个错误:

Feed.js:94 undefined "parsererror" "SyntaxError: Unexpected token < in JSON at position 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)
    });
  },

使用line console.error(this.props. error)url,状态,err.toString()下划线。

因为这个错误看起来似乎与从服务器提取JSON数据有关,所以我尝试从一个空白db开始,但错误仍然存在。这个错误似乎在一个无限循环中被调用,可能是因为React不断尝试连接到服务器,最终导致浏览器崩溃。

编辑:

我已经用Chrome开发工具和Chrome REST客户端检查了服务器响应,数据似乎是正确的JSON。

编辑2:

虽然预期的API端点确实返回了正确的JSON数据和格式,但React轮询的是http://localhost:3000/?_=1463499798727而不是预期的http://localhost:3001/api/threads。

我在端口3000上运行webpack热重载服务器,在端口3001上运行express应用程序以返回后端数据。令人沮丧的是,这是正确的工作,我最后一次工作,找不到什么我可以改变,打破它。


您正在从服务器接收HTML(或XML),但是dataType: json告诉jQuery解析为json。检查Chrome开发工具中的“网络”选项卡,查看服务器响应的内容。

错误消息的措辞对应于你从谷歌Chrome当你运行JSON.parse('<…')。我知道你说服务器正在设置Content-Type:application/json,但我被引导相信响应体实际上是HTML。

Feed.js:94 undefined "parsererror" "SyntaxError: Unexpected token < in JSON at position 0" 使用line console.error(this.props. error)url, status, err.toString())下划线。

err实际上是在jQuery中抛出的,并作为变量err传递给您。这一行下划线的原因只是因为这是您记录它的地方。

我建议您添加到日志记录中。查看实际的xhr (XMLHttpRequest)属性以了解有关响应的更多信息。尝试添加console.warn(xhr.responseText),您将很可能看到正在接收的HTML。

我在学习教程后也遇到了同样的错误信息。我们的问题似乎是'url: this.props。Url '在ajax调用中。在反应。DOM创建元素时,我的元素是这样的。

ReactDOM.render(
    <CommentBox data="/api/comments" pollInterval={2000}/>,
    document.getElementById('content')
);

这个CommentBox在它的props中没有url,只有数据。当我切换url: this.props.url -> url: this.props。数据,它对服务器做出了正确的调用,我得到了预期的数据。

我希望这能有所帮助。

对我来说,这最终是一个权限问题。我试图访问一个我没有cancan授权的url,所以url被切换到users/sign_in。重定向url响应html,而不是json。html响应中的第一个字符是<。

我的情况下,错误是由于我没有分配我的返回值给一个变量。产生错误信息的原因如下:

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

我把它改成:

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

如果没有变量,JSON将无法正确格式化数据。

我的问题是,我得到的数据在一个字符串不是在一个适当的JSON格式,然后我试图解析它。简单的例子:JSON。parse('{hello there}')将在h处给出错误。在我的例子中,回调url在对象之前返回了一个不必要的字符:employee_names([{"name":....在e(0)处有误差。我的回调URL本身有一个问题,当修复时,只返回对象。

在花了很多时间之后,我发现在我的情况下,问题是在我的包上定义了“主页”。Json文件使我的应用程序不能在firebase上工作(相同的“令牌”错误)。 我使用create-react-app创建了我的react应用程序,然后我在READ上使用了firebase指南。me文件部署到github页面,意识到我必须做额外的工作路由器的工作,并切换到firebase。Github指南已经在包上添加了主页键。Json,并导致部署问题。

在我的情况下,我得到这个运行的webpack。它在本地node_modules目录的某个地方被损坏了。

rm -rf node_modules
npm install

...足够让它恢复正常工作了。

我遇到了这个错误“SyntaxError:在JSON位置中意外的令牌m”,其中令牌“m”可以是任何其他字符。

事实证明,当我使用RESTconsole进行DB测试时,我在JSON对象中漏掉了一个双引号,如{"name: "math"}。正确的应该是{"name": "math"}。

我费了很大劲才弄清楚这个笨拙的错误。恐怕其他人也会遇到类似的问题。

Protip:在本地Node.js服务器上测试json ?确保您还没有路由到该路径的内容

'/:url(app|assets|stuff|etc)';

在JSON中的位置0处出现意外的令牌<

这个错误的一个简单解决方案是用样式编写注释。更少的文件。

为了补充答案,当API响应包含时也会发生这种情况

<?php{username: 'Some'}

当您的后端使用PHP时,可能会出现这种情况。

在我的例子中,对于一个Azure托管的Angular 2/4站点,我对mySite/ API /…由于mySite路由问题正在重定向。因此,它从重定向页面返回HTML,而不是api JSON。我在网上添加了一个排除项。API路径的配置文件。

我在本地开发时没有得到这个错误,因为站点和API在不同的端口上。也许有更好的办法……但它奏效了。

<?xml version="1.0" encoding="UTF-8"?>
 
<configuration>
    <system.webServer>
        <rewrite>
        <rules>
        <clear />
 
        <!-- ignore static files -->
        <rule name="AngularJS Conditions" stopProcessing="true">
        <match url="(app/.*|css/.*|fonts/.*|assets/.*|images/.*|js/.*|api/.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="None" />
        </rule>
 
        <!--remaining all other url's point to index.html file -->
        <rule name="AngularJS Wildcard" enabled="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="Rewrite" url="index.html" />
        </rule>
 
        </rules>
        </rewrite>
    </system.webServer>
</configuration>

2022年更新:这篇文章是几年前写的。我认为这个建议更像是一个变通方案——直接解决方案。更好的托管模式是不要试图在你的网站路径下托管这些api路径;相反,将它们完全托管在独立的基本url上。对于我的用例示例,API和Web路径将是完全独立的Azure Web服务,并将获得不同的URL端点。

一般来说,当解析JSON对象时出现语法错误,就会出现这种错误。可以这样想,message属性包含未转义的双引号:

{
    "data": [{
        "code": "1",
        "message": "This message has "unescaped" quotes, which is a JSON syntax error."
    }]
}

如果你的应用程序中有JSON,那么最好通过JSONLint来运行它,以验证它是否有语法错误。但在我的经验中,通常不是这样的,通常是从API返回的JSON才是罪魁祸首。

当向HTTP API发出XHR请求时,返回一个Content-Type:application/json的响应;charset=UTF-8报头,在响应体中包含无效的JSON,您将看到此错误。

如果服务器端API控制器不恰当地处理语法错误,并将其作为响应的一部分打印出来,则将破坏返回的JSON结构。一个很好的例子是在响应体中包含PHP Warning或Notice的API响应:

<b>Notice</b>:  Undefined variable: something in <b>/path/to/some-api-controller.php</b> on line <b>99</b><br />
{
    "success": false,
    "data": [{ ... }]
}

95%的情况下,这是我的问题来源,尽管在这里的其他回复中有一些解决方案,但我觉得它没有被清楚地描述。希望这能帮到你,如果你正在寻找一种方便的方法来追踪哪个API响应包含JSON语法错误,我已经为此写了一个Angular模块。

下面是这个模块:

/**
 * Track Incomplete XHR Requests
 * 
 * Extend httpInterceptor to track XHR completions and keep a queue 
 * of our HTTP requests in order to find if any are incomplete or 
 * never finish, usually this is the source  of the issue if it's 
 * XHR related
 */
angular.module( "xhrErrorTracking", [
        'ng',
        'ngResource'
    ] )
    .factory( 'xhrErrorTracking', [ '$q', function( $q ) {
        var currentResponse = false;

        return {
            response: function( response ) {
                currentResponse = response;
                return response || $q.when( response );
            },
            responseError: function( rejection ) {
                var requestDesc = currentResponse.config.method + ' ' + currentResponse.config.url;
                if ( currentResponse.config.params ) requestDesc += ' ' + JSON.stringify( currentResponse.config.params );

                console.warn( 'JSON Errors Found in XHR Response: ' + requestDesc, currentResponse );

                return $q.reject( rejection );
            }
        };
    } ] )
    .config( [ '$httpProvider', function( $httpProvider ) {
        $httpProvider.interceptors.push( 'xhrErrorTracking' );
    } ] );

更多细节可以在上面引用的博客文章中找到,我没有在这里发布所有发现的东西,因为它可能并不都相关。

当您将响应定义为application/json并获得HTML作为响应时,就会发生此错误。基本上,这种情况发生在您为特定url编写服务器端脚本时,其响应为JSON,但错误格式为HTML。

对我来说,当我作为JSON返回的对象上的一个属性抛出异常时,就会发生这种情况。

public Dictionary<string, int> Clients { get; set; }
public int CRCount
{
    get
    {
        var count = 0;
        //throws when Clients is null
        foreach (var c in Clients) {
            count += c.Value;
        }
        return count;
    }
}

添加一个空检查,为我修复:

public Dictionary<string, int> Clients { get; set; }
public int CRCount
{
    get
    {
        var count = 0;
        if (Clients != null) {
            foreach (var c in Clients) {
                count += c.Value;
            }
        }
        return count;
    }
}

只是一些基本的检查,确保你没有任何注释在json文件

//comments here will not be parsed and throw error

在python中,您可以在将结果发送到html模板之前使用json.Dump(str)。 使用此命令字符串转换为正确的json格式并发送到HTML模板。在将结果发送到JSON.parse(result)后,这是正确的响应,您可以使用它。

这可能是旧的。但在Angular中,请求和响应的内容类型在我的代码中是不同的。检查标题

 let headers = new Headers({
        'Content-Type': 'application/json',
        **Accept**: 'application/json'
    });

React axios

axios({
  method:'get',
  url:'http://  ',
 headers: {
         'Content-Type': 'application/json',
        Accept: 'application/json'
    },
  responseType:'json'
})

jQuery Ajax:

 $.ajax({
      url: this.props.url,
      dataType: 'json',
**headers: { 
          'Content-Type': 'application/json',
        Accept: 'application/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)
    });
  },
 

对于一些人来说,这可能会对你们有所帮助: 我使用Wordpress REST API也有类似的经历。我甚至使用Postman来检查我是否有正确的路线或终点站。我后来发现我不小心在我的脚本中放了一个“echo”- hooks:

调试和检查控制台

错误原因

所以基本上,这意味着我打印了一个不是JSON的值,它与导致AJAX错误的脚本混合在一起-“SyntaxError:意外令牌r在JSON中的位置0”

这可能是因为你的javascript代码正在查看一些json响应,而你收到了其他类似文本的东西。

确保响应是JSON格式的,否则会触发此错误。

那些使用create-react-app并试图获取本地json文件的人。

与create-react-app一样,webpack-dev-server用于处理请求,并为每个请求提供index.html。所以你得到

SyntaxError:在JSON中,位置0处出现了意外的标记<。

要解决这个问题,您需要弹出应用程序并修改webpack-dev-server配置文件。

您可以从这里开始按步骤操作。

在我的情况下(后端),我使用res.send(令牌);

当我更改为res.send(data)时,一切都得到了修复;

你可能想检查一下,如果一切都在工作和张贴,但错误不断弹出在你的前端。

出现这种错误的可能性是巨大的。

在我的情况下,我发现问题是在包中添加主页文件。Json导致了这个问题。

值得检查:在包装中。json的改变:

homepage: "www.example.com"

to

hompage: ""   

简而言之,如果您得到这个错误或类似的错误,这只意味着一件事:在我们的代码库中,我们期望处理有效的JSON格式,但我们没有得到。例如,

var string = "some string";
JSON.parse(string)

会抛出一个错误,说

Uncaught SyntaxError: JSON中0号位置出现了意外的令牌

因为,字符串中的第一个字符是s &它现在不是一个有效的JSON。这也会在中间产生错误。如:

var invalidJSON= '{"foo" : "bar", "missedquotehere : "value" }';
JSON.parse(invalidJSON)

将抛出错误:

VM598:1 Uncaught SyntaxError: Unexpected token v in JSON at position 36

因为我们故意在JSON字符串invalidJSON的第36位漏掉了一个引号。

如果你解决了这个问题:

var validJSON= '{"foo" : "bar", "missedquotehere" : "value" }';
JSON.parse(validJSON)

会给你一个JSON格式的对象。

此错误可以在任何位置和任何框架/库中抛出。大多数情况下,您可能会读取一个不是有效JSON的网络响应。所以调试这个问题的步骤可以是这样的:

curl或击中你正在调用的实际API。 记录/复制响应,并尝试使用JSON.parse解析它。如果你得到错误,修复它。 如果不是,请确保您的代码没有突变/改变原始响应。

我也面临着同样的问题。

我删除了dataType:'json'从$。ajax方法。

如果其他人正在从Mozilla Web API的“using fetch”文档中使用fetch: (这个很有用:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)

  fetch(api_url + '/database', {
    method: 'POST', // or 'PUT'
    headers: {
     'Content-Type': 'application/json'
    },
    body: qrdata //notice that it is not qr but qrdata
  })
  .then((response) => response.json())
  .then((data) => {
    console.log('Success:', data);
  })  
  .catch((error) => {
  console.error('Error:', error);  });

这是在函数内部:

async function postQRData(qr) {

  let qrdata = qr; //this was added to fix it!
  //then fetch was here
}

我传入我的函数qr我认为是一个对象,因为qr看起来像这样:{"name": "Jade", "lname": "Bet", "pet":"cat"},但我一直得到语法错误。 当我将它赋值给其他对象时:let qrdata = qr;它工作。

在我的情况下,有问题的“持有人”在头部理想情况下,它应该是“持有人”(结束字符后的空格),但在我的情况下,它是“持有人”,字符后没有空格。希望它能帮助到一些人!

也许有一些权限错误,只是尝试切换浏览器,从一个授权帐户登录。

SyntaxError:在JSON中,位置0处出现了意外的标记<


您将得到一个HTML文件(或XML)而不是json。

Html文件以<!DOCTYPE html >。

我在取回方法中忘记了https://,从而“实现”了这个错误:

fetch(`/api.github.com/users/${login}`)
    .then(response => response.json())
    .then(setData);

我证实了我的预感:

我将响应记录为文本而不是JSON。

fetch(`/api.github.com/users/${login}`)
    .then(response => response.text())
    .then(text => console.log(text))
    .then(setData);

是的,一个html文件。

解决方案:

我通过在取回方法中添加回https://来修正这个错误。

fetch(`https://api.github.com/users/${login}`)
    .then(response => response.json())
    .then(setData)
    .catch(error => (console.log(error)));

对于未来的谷歌人:

如果服务器端函数崩溃,将生成此消息。

或者如果服务器端函数根本不存在(即函数名中的错别字)。

所以-假设你正在使用一个GET请求…一切看起来都很完美,你已经检查了三遍……

再次检查GET字符串。我的是:

'/theRouteIWant&someVar=Some value to send'

应该是

'/theRouteIWant?someVar=Some value to send'
               ^

崩溃 !       (…不可见地,在服务器上……)

Node/Express返回非常有用的消息: SyntaxError:在JSON中,位置0处出现意外标记<

正如其他答案所描述的那样,畸形的JSON或HTML而不是JSON是这个问题的根本原因,然而在我的情况下,我不能可靠地复制这个错误,就好像服务器有时返回有效的JSON,而其他时候返回其他像HTML错误页面或类似的东西。

为了避免它完全破坏页面,我手动尝试解析返回的内容,并分享它,以防它帮助其他人解决问题。

const url = "https://my.server.com/getData";

fetch(url).then(response => {
  if (!response.ok) return; // call failed

  response.text().then(shouldBeJson => { // get the text-only of the response
    let json = null;
    try {
      json = JSON.parse(shouldBeJson); // try to parse that text
    } catch (e) {
      console.warn(e); // json parsing failed
      return;
    };
    if (!json) return; // extra check just to make sure we have something now.

    // do something with my json object
  });
});

虽然这显然不能解决问题的根本原因,但它仍然可以帮助更优雅地处理问题,并在失败时采取某种合理的操作。

如果你在Chrome扩展中收到这个错误,很难追踪,特别是当它发生在你安装扩展的时候。然而,我找到了一个更简单的方法。

我有一个Chrome扩展,在安装插件时,从我的web服务器调用一些脚本,拉下一些默认设置。我收到了错误:

SyntaxError: Unexpected token < in JSON at position 0 in _generated_background_page.html

当你得到这个,进入扩展,找到你的扩展,点击“背景页面”超链接,检查器将打开它。然后进入网络,按CTRL+R。现在,你会看到背景页面需要加载的所有东西。

单击每一个,特别是那些连接回远程服务器的。你会在Network选项卡中看到Headers,然后是Preview。查看每个项目的预览。如果您看到该数据的报头与预期的不同,或者看到错误,那么这可能是您的原因。

在我的例子中,我的服务器脚本正在调用另一个脚本,该脚本由于运行时缺少变量而有一个错误,这使得我的application/json头与它正在发送的数据不匹配,导致意外的令牌错误。

在我的例子中,当在测试API节点中发送数据时,JSON对象在结尾有一个额外的逗号:

文章http://localhost: 9000 / api /文章/ 内容类型:application / json { “标题”:“sokka”, "description": "希望这有用", "username": "sokka blog4", }

所以我只需要删除额外的逗号,并发送这样的数据:

文章http://localhost: 9000 / api /文章/ 内容类型:application / json { “标题”:“sokka”, "description": "希望这有用", "用户名":"sokka blog4" }

我使用RESTclient扩展来测试我的API。

对于CRA制作的React应用程序,在获取任何<dummy.json>的JSON数据时,我们可能会面临两个主要问题 文件。

我有假人。json文件在我的项目中,我试图从该文件中获取json数据,但我得到了两个错误:

"SyntaxError: Unexpected token < in JSON at position 0 .

我在Chrome或任何浏览器的网络选项卡中的响应中得到了一个HTML文件而不是实际的JSON数据。

下面是解决我的问题的两个主要原因。

JSON文件中的JSON数据无效。 这可能是JSON文件没有正确加载,所以你只是重新启动你的React服务器。这是我在React中的问题。

React直接运行或访问公用文件夹,而不是src文件夹。

我是怎么解决的:

我把我的文件移动到公共文件夹和访问是直接在src文件夹的任何文件。

在Redux action.js中调用REST:

export const fetchDummy = ()=>{
return (dispatch)=>{
        dispatch(fetchDummyRequest());
        fetch('./assets/DummyData.json')
        .then(response => {
            if (!response.ok) {
                throw new Error("HTTP error " + response.status);
            }
            return response.json();
        })
        .then(result => {
            dispatch(fetchDummySuccess(result))
        })
        .catch(function (err) {
          dispatch(fetchDummyFailure(err))
        })
    }
}

如果你试着在控制台中运行这行代码:

JSON.parse(undefined);

你会得到同样的错误信息:

"SyntaxError: Unexpected token < in JSON at position 0"

因此,你的应用程序试图解析一个无效的未定义JSON。

我得到了同样的错误,而调用一个API在React中使用获取API与POST方法。

之前:

fetch('/api/v1/tour',{
      method:"POST",
      headers:{"Content-type":"json/application"},
      body:JSON.stringify(info)
    })
    .then((response)=>response.json())
    .then((json)=>{
      if(json.status === 'success')
        alert(json.message)
      else
        console.log('something went wrong :(')
    }).catch(e=>console.log(e))

我通过将头文件更改为{"Content-type":"application/json"}来解决这个错误:

后:

fetch('/api/v1/tour',{
      method:"POST",
      headers:{"Content-type":"application/json"},
      body:JSON.stringify(info)
    })
    .then((response)=>response.json())
    .then((json)=>{
      if(json.status === 'success')
        alert(json.message)
      else
        console.log('something went wrong :(')
    }).catch(e=>console.log(e))

在大多数情况下,我得到这个错误,当API抛出一个文本格式的错误。 我的建议是查看错误文本内容,以找出发生了什么错误。

jQuery = > set dataType: 'text' fetch = > response .text()代替response .json()

检查发出请求的端点地址。 如果它拼写错误,这可能是错误的原因,因为结束点返回HTML