“ SyntaxError: โทเค็นที่ไม่คาดคิด <ใน JSON ที่ตำแหน่ง 0”


199

ในองค์ประกอบแอป React ที่จัดการฟีดเนื้อหาคล้าย Facebook ฉันพบข้อผิดพลาด:

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 จากเซิร์ฟเวอร์ฉันจึงลองเริ่มจากฐานข้อมูลเปล่า แต่ข้อผิดพลาดยังคงอยู่ ดูเหมือนว่าข้อผิดพลาดจะถูกเรียกในวงวนไม่สิ้นสุดเนื่องจาก React พยายามเชื่อมต่อกับเซิร์ฟเวอร์อย่างต่อเนื่องและในที่สุดก็เกิดปัญหาเบราว์เซอร์

แก้ไข:

ฉันได้ตรวจสอบการตอบสนองของเซิร์ฟเวอร์ด้วยเครื่องมือพัฒนา Chrome และไคลเอนต์ Chrome REST และข้อมูลดูเหมือนจะเป็น JSON ที่เหมาะสม

แก้ไข 2:

ปรากฏว่าแม้ว่าจุดปลายทาง API ที่ตั้งใจส่งคืนข้อมูลและรูปแบบ JSON ที่ถูกต้องจริง ๆ แล้ว React กำลังทำการสำรวจhttp://localhost:3000/?_=1463499798727มากกว่าที่คาดhttp://localhost:3001/api/threadsไว้

ฉันใช้เซิร์ฟเวอร์ hot-reload ของ webpack บนพอร์ต 3000 ด้วยแอปด่วนที่ทำงานบนพอร์ต 3001 เพื่อส่งคืนข้อมูลแบ็กเอนด์ สิ่งที่น่าผิดหวังคือที่นี่ทำงานได้อย่างถูกต้องในครั้งสุดท้ายที่ฉันทำงานและไม่สามารถหาสิ่งที่ฉันสามารถเปลี่ยนแปลงเพื่อทำลายมันได้


11
นั่นแสดงว่า "JSON" ของคุณเป็น HTML จริงๆ ดูข้อมูลที่คุณได้รับจากเซิร์ฟเวอร์
Quentin

2
นี่เป็นข้อผิดพลาดที่คุณได้รับหากคุณทำสิ่งที่ต้องการJSON.parse("<foo>")- สตริง JSON (ซึ่งคุณคาดหวังด้วยdataType: 'json') ไม่สามารถเริ่มต้น<ได้
apsillers

ดังที่ @ quantin กล่าวว่าอาจเป็น html อาจเป็นข้อผิดพลาดบางอย่างลอง URL เดียวกันกับลูกค้าที่เหลือ
maurycy

เหมือนที่ผมกล่าวถึงฉันพยายามด้วยฐานข้อมูลที่ว่างเปล่า (ซึ่งผลตอบแทนเพียง []) และมันก็ยังคงให้ข้อผิดพลาดเดียวกัน
คาเมรอนสีมา

คุณได้มากที่สุดจำเป็นต้อง API NODE_ENVพร็อกซี่คำขอขึ้นอยู่กับคุณ ดูสิ่งนี้: github.com/facebookincubator/create-react-app/blob/master/…
Kevin Suttle

คำตอบ:


148

ถ้อยคำของสอดคล้องกับข้อผิดพลาดกับสิ่งที่คุณได้รับจาก Google 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 ที่ได้รับมากที่สุด


3
ขอขอบคุณฉันทำสิ่งนี้และคุณพูดถูก - ทำปฏิกิริยาคือการสำรวจ URL ที่ไม่ถูกต้องและส่งคืนเนื้อหาของ index.html ฉันไม่สามารถหาสาเหตุ
คาเมรอนสีมา

8
ขอบคุณสำหรับคำสั่งเพิ่มเติมการแก้จุดบกพร่อง console.warn(jqxhr.responseText)แต่ฉันจำเป็นต้องใช้ มันมีประโยชน์มากในการวินิจฉัยปัญหาของฉัน
user2441511

@ Mimi314159, console.log, console.warnและconsole.errorจะเขียนทั้งหมดกับคอนโซลของคุณ อย่างไรก็ตามโดยปกติคอนโซลจะมีตัวเลือกการบันทึกการกรองเพื่อให้แน่ใจว่าตัวเลือกนั้นเปิดใช้งานหรือปิดการใช้งานตามที่คุณต้องการ
สนามไบรอัน

1
ในกรณีของฉันเกิดข้อผิดพลาด PHP เกิดขึ้นซึ่งทำให้เซิร์ฟเวอร์ส่งคืน HTML แทนที่จะเป็น JSON ที่ถูกต้อง
Derek S

54

คุณได้รับ HTML (หรือ XML) กลับมาจากเซิร์ฟเวอร์ แต่dataType: jsonกำลังบอกให้ jQuery แยกวิเคราะห์เป็น JSON ตรวจสอบแท็บ "เครือข่าย" ในเครื่องมือ dev Chrome เพื่อดูเนื้อหาของการตอบสนองของเซิร์ฟเวอร์


ฉันตรวจสอบแล้วและดูเหมือนว่าจะส่งคืน json ในรูปแบบที่เหมาะสม นี่คือหัวข้อการตอบสนอง: Access-Control-Allow-Origin: * การควบคุมแคช: ไม่มีแคชเนื้อหายาว: 2487 ประเภทเนื้อหา: application / json; charset = utf-8 วันที่: อังคาร, 17 พฤษภาคม 2016 15:34:00 GMT ETag: W / "9b7-yi1 / G0RRpr0DlOVc9u7cMw X" ขับเคลื่อนโดย: Express
Cameron Sima

1
@AVI ฉันเชื่อว่าคุณต้องระบุประเภท MIME ในคลาสทรัพยากรของคุณ (เช่น)@Produces(MediaType.APPLICATION_JSON)
DJ2

10

เรื่องนี้จบลงด้วยการเป็นปัญหาสิทธิ์สำหรับฉัน ผมพยายามที่จะเข้าถึง URL ฉันไม่ได้รับอนุญาตกับ cancan ดังนั้น URL users/sign_inที่ถูกเปลี่ยนไป URL ที่เปลี่ยนเส้นทางตอบสนองต่อ html ไม่ใช่ json ตัวอักษรตัวแรกในการตอบสนอง html <ที่เป็น


และเมื่อคุณได้รับ HTML เป็นคำตอบ .. คุณจะเปลี่ยนเส้นทางไปยัง html นี้ได้อย่างไร ขอบคุณ.
JuMoGar

1
ฉันมีเหมือนกันแม้ว่าใน ASP.NET MVC สำหรับ. NETters อื่นฉันลืมที่จะตกแต่งแอ็คชั่นของฉันด้วยแอตทริบิวต์ [AllowAnonymous] ดังนั้นเฟรมเวิร์กจึงพยายามคืนข้อผิดพลาดที่ไม่ได้รับอนุญาตใน HTML ซึ่งทำให้การโทร AJAX ของฉันล้มเหลว
Jason Marsell

8

ฉันพบข้อผิดพลาดนี้ "SyntaxError: โทเค็น m ใน JSON ที่ตำแหน่งไม่คาดคิด" ซึ่งโทเค็น 'm' สามารถเป็นอักขระอื่น ๆ ได้

ปรากฎว่าฉันพลาดหนึ่งในเครื่องหมายคำพูดคู่ในวัตถุ JSON เมื่อฉันใช้ RESTconsole สำหรับการทดสอบ DB เป็น {"ชื่อ:" คณิตศาสตร์ "} สิ่งที่ถูกต้องควรเป็น {" ชื่อ ":" คณิตศาสตร์ "}

ฉันใช้ความพยายามอย่างมากในการหาข้อผิดพลาดที่เงอะงะนี้ ฉันเกรงว่าคนอื่นจะวิ่งเข้าหาคนที่คล้ายกัน


5

ในกรณีของฉันฉันได้รับ webpack ที่ใช้งานอยู่และมันกลับกลายเป็นความเสียหายบางอย่างในท้องถิ่น node_modules dir

rm -rf node_modules
npm install

... ก็เพียงพอที่จะทำให้มันทำงานได้อีกครั้ง


1
พร้อมนี้ฉันพยายามลบ package-lock.json จากนั้นก็ใช้งานได้สำหรับฉัน
Mahesh

3

ฉันกรณีของฉันข้อผิดพลาดเป็นผลมาจากฉันไม่ได้กำหนดค่าตอบแทนของฉันให้กับตัวแปร ข้อความต่อไปนี้เป็นสาเหตุของข้อผิดพลาด:

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

ฉันเปลี่ยนเป็น:

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

หากไม่มีตัวแปร JSON จะไม่สามารถจัดรูปแบบข้อมูลได้อย่างถูกต้อง


3

ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณกำหนดการตอบสนองapplication/jsonและคุณได้รับ HTML เป็นการตอบสนอง โดยทั่วไปสิ่งนี้จะเกิดขึ้นเมื่อคุณเขียนสคริปต์ฝั่งเซิร์ฟเวอร์สำหรับ url ที่เฉพาะเจาะจงพร้อมการตอบสนองของ JSON แต่รูปแบบข้อผิดพลาดเป็น HTML




1

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกันหลังจากการสอน ปัญหาของเราน่าจะเป็น 'url: this.props.url' ในการโทร ajax ใน React.DOM เมื่อคุณสร้างองค์ประกอบของคุณฉันมีลักษณะเช่นนี้

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

CommentBox นี้ไม่มี URL ในอุปกรณ์ประกอบฉากเพียงแค่ข้อมูล เมื่อฉันสลับurl: this.props.url-> url: this.props.dataมันเป็นการโทรที่ถูกต้องไปยังเซิร์ฟเวอร์และฉันได้รับข้อมูลกลับมา

ฉันหวังว่ามันจะช่วย


1

ปัญหาของฉันคือฉันได้รับข้อมูลกลับมาใน stringที่ไม่ได้อยู่ในรูปแบบ JSON ที่เหมาะสมซึ่งฉันพยายามแยกวิเคราะห์มัน simple example: JSON.parse('{hello there}')จะให้ข้อผิดพลาดที่ชั่วโมง ในกรณีของฉัน url การติดต่อกลับได้ส่งคืนอักขระที่ไม่จำเป็นก่อนวัตถุ: employee_names([{"name":....และได้รับข้อผิดพลาดที่ e ที่ 0 URL การติดต่อกลับของฉันเองมีปัญหาซึ่งเมื่อแก้ไขแล้วส่งคืนเฉพาะวัตถุเท่านั้น


1

ในกรณีของฉันสำหรับไซต์ Azure ที่โฮสต์ Angular 2/4 การเรียก API ของฉันไปยัง mySite / api / ... ถูกเปลี่ยนเส้นทางเนื่องจากปัญหาการกำหนดเส้นทาง mySite ดังนั้นมันจึงส่งคืน HTML จากหน้าเปลี่ยนเส้นทางแทนที่จะเป็น api JSON ฉันได้เพิ่มการยกเว้นในไฟล์ web.config สำหรับเส้นทาง 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>

1

นี่อาจจะเก่า แต่มันเกิดขึ้นในเชิงมุมประเภทของเนื้อหาสำหรับการร้องขอและการตอบสนองแตกต่างกันในรหัสของฉัน ดังนั้นตรวจสอบส่วนหัวของ

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

ในปฏิกิริยาตอบสนอง

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)
    });
  },

1

โดยสรุปหากคุณได้รับข้อผิดพลาดนี้หรือข้อผิดพลาดที่คล้ายกันนั่นหมายถึงสิ่งเดียวเท่านั้น นั่นคือในบางแห่งใน codebase ของเราเราคาดว่ารูปแบบ JSON ที่ถูกต้องในการประมวลผลและเราไม่ได้รับหนึ่ง ตัวอย่างเช่น:

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

จะโยนข้อผิดพลาดพูด

Uncaught SyntaxError: โทเค็นที่ไม่คาดคิดใน JSON ที่ตำแหน่ง 0

เพราะตัวอักษรตัวแรกในstringเป็น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 ดังนั้นขั้นตอนการแก้ไขข้อบกพร่องอาจเป็นเช่นนี้:

  1. curl หรือกด API จริงที่คุณโทร
  2. เข้าสู่ระบบ / JSON.parseคัดลอกการตอบสนองและพยายามที่จะแยกมันด้วย หากคุณได้รับข้อผิดพลาดแก้ไขได้
  3. หากไม่เป็นเช่นนั้นตรวจสอบให้แน่ใจว่ารหัสของคุณไม่ได้กลายพันธุ์ / เปลี่ยนการตอบกลับดั้งเดิม

0

หลังจากใช้เวลากับสิ่งนี้ไปมากฉันพบว่าในกรณีของฉันปัญหาคือมีการกำหนด "โฮมเพจ" ไว้ในไฟล์ package.json ทำให้แอปของฉันไม่ทำงานบน firebase (ข้อผิดพลาด 'token' เดียวกัน) ฉันสร้างแอป react โดยใช้ create-react-app จากนั้นฉันใช้คำแนะนำ firebase ในไฟล์ READ.me เพื่อนำไปใช้กับหน้า github ฉันรู้ว่าฉันต้องทำงานพิเศษเพื่อให้เราเตอร์ทำงานและเปลี่ยนเป็น firebase คู่มือ github ได้เพิ่มคีย์โฮมเพจบน package.json และทำให้เกิดปัญหาการปรับใช้


0

Protip: การทดสอบ json บนเซิร์ฟเวอร์ Node.js ท้องถิ่น ตรวจสอบให้แน่ใจว่าคุณไม่มีสิ่งที่กำหนดเส้นทางไปยังเส้นทางนั้น

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

0

ในระดับทั่วไปข้อผิดพลาดนี้เกิดขึ้นเมื่อมีการแยกวิเคราะห์วัตถุ JSON ที่มีข้อผิดพลาดทางไวยากรณ์ นึกถึงบางสิ่งเช่นนี้โดยที่คุณสมบัติของข้อความมีเครื่องหมายคำพูดคู่ที่ไม่ใช้ค่า Escape:

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

หากคุณมี JSON ในแอปของคุณอยู่ที่ไหนสักแห่งก็เป็นการดีที่จะเรียกใช้ผ่านJSONLintเพื่อตรวจสอบว่าไม่มีข้อผิดพลาดทางไวยากรณ์ ปกติแล้วนี่ไม่ใช่กรณีของประสบการณ์ของฉัน แต่โดยทั่วไปแล้ว JSON จะส่งคืนจาก API ที่เป็นตัวการ

เมื่อมีการร้องขอ XHR ไปยัง HTTP API ที่ส่งคืนการตอบกลับด้วย Content-Type:application/json; charset=UTF-8ส่วนหัวซึ่งมี JSON ที่ไม่ถูกต้องในเนื้อหาของการตอบสนองคุณจะเห็นข้อผิดพลาดนี้

หากคอนโทรลเลอร์ API ฝั่งเซิร์ฟเวอร์จัดการกับข้อผิดพลาดทางไวยากรณ์อย่างไม่ถูกต้องและจะถูกพิมพ์ออกมาเป็นส่วนหนึ่งของการตอบสนองซึ่งจะทำลายโครงสร้างของ JSON ที่ส่งคืน ตัวอย่างที่ดีคือการตอบกลับ API ที่มีคำเตือน PHP หรือประกาศในเนื้อหาการตอบกลับ:

<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' );
    } ] );

รายละเอียดเพิ่มเติมสามารถพบได้ในบทความบล็อกที่อ้างถึงข้างต้นฉันไม่ได้โพสต์ทุกสิ่งที่พบที่นี่เพราะมันอาจจะไม่เกี่ยวข้องทั้งหมด


0

สำหรับฉันสิ่งนี้เกิดขึ้นเมื่อคุณสมบัติอย่างใดอย่างหนึ่งบนวัตถุที่ฉันส่งคืนเนื่องจาก 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;
    }
}

0

ตรวจสอบให้แน่ใจว่าคุณไม่มีความเห็นในไฟล์ json

//comments here will not be parsed and throw error

0

เพียงเพิ่มคำตอบก็จะเกิดขึ้นเมื่อการตอบสนอง API ของคุณรวมอยู่ด้วย

<?php{username: 'Some'}

ซึ่งอาจเป็นกรณีที่แบ็กเอนด์ของคุณใช้ PHP


0

ใน python คุณสามารถใช้ json.Dump (str) ก่อนส่งผลลัพธ์ไปยังเทมเพลต html ด้วยสตริงคำสั่งนี้แปลงเป็นรูปแบบ json ที่ถูกต้องและส่งไปยังเทมเพลต html หลังจากส่งผลลัพธ์นี้ไปยัง JSON.parse (ผลลัพธ์) นี่เป็นการตอบสนองที่ถูกต้องและคุณสามารถใช้สิ่งนี้ได้


0

สำหรับบางคนสิ่งนี้อาจช่วยคุณได้: ฉันมีประสบการณ์คล้ายกับ Wordpress REST API ฉันยังใช้บุรุษไปรษณีย์เพื่อตรวจสอบว่าฉันมีเส้นทางหรือจุดสิ้นสุดที่ถูกต้อง ต่อมาฉันพบว่าฉันใส่ "echo" ลงในสคริปต์ของฉันโดยไม่ได้ตั้งใจ - hooks:

แก้ไขข้อบกพร่อง & ตรวจสอบคอนโซลของคุณ

สาเหตุของข้อผิดพลาด

โดยพื้นฐานแล้วนี่หมายความว่าฉันพิมพ์ค่าที่ไม่ใช่ JSON ที่ผสมกับสคริปต์ที่ทำให้เกิดข้อผิดพลาด AJAX - "SyntaxError: โทเค็นที่ไม่คาดคิดใน JSON ที่ตำแหน่ง 0"


0

สิ่งนี้อาจเกิดจากโค้ดจาวาสคริปต์ของคุณกำลังตรวจสอบการตอบสนองของ json และคุณได้รับข้อความอย่างอื่น


1
โปรดอธิบายอย่างละเอียดในขณะที่ให้คำตอบมากกว่าที่จะให้หนึ่งตอร์ปิโดเว้นแต่พวกเขาจะแก้คำตอบทันที คำอธิบายจะช่วยให้ผู้ค้นหาคำตอบเข้าใจวิธีการแก้ปัญหาได้ดีขึ้น
ไร่

0

ฉันมีปัญหาเดียวกัน ฉันกำลังใช้เซิร์ฟเวอร์ node.js ง่าย ๆ ในการส่งการตอบสนองไปยังไคลเอนต์ที่ทำใน Angular 7 ตอนแรกฉันกำลังส่งการตอบกลับ end ('สวัสดีชาวโลกจาก nodejs server'); ถึงลูกค้า แต่อย่างใดเชิงมุมไม่สามารถแยกมันได้


0

ผู้ที่ใช้งานcreate-react-appและพยายามดึงไฟล์ json ในเครื่อง

ในขณะที่create-react-app, จะใช้ในการจัดการการร้องขอและขอทุกมันทำหน้าที่webpack-dev-server index.htmlดังนั้นคุณจะได้รับ

SyntaxError: โทเค็นที่ไม่คาดคิด <ใน JSON ที่ตำแหน่ง 0

ในการแก้ปัญหานี้คุณต้องนำแอพออกและแก้ไขwebpack-dev-serverไฟล์การกำหนดค่า

คุณสามารถทำตามขั้นตอนจากที่นี่ที่นี่


0

ในกรณีของฉัน (แบ็กเอนด์) ฉันใช้ res.send (โทเค็น);

ทุกอย่างได้รับการแก้ไขเมื่อฉันเปลี่ยนเป็นส่งอีกครั้ง (ข้อมูล);

คุณอาจต้องการตรวจสอบสิ่งนี้หากทุกอย่างทำงานและโพสต์ตามที่ตั้งใจ แต่ข้อผิดพลาดยังคงปรากฏขึ้นในส่วนหน้าของคุณ


0

ความเป็นไปได้สำหรับข้อผิดพลาดนี้มีมากมาย

ในกรณีของฉันฉันพบว่าปัญหากำลังเพิ่มไฟล์homepageในpackage.jsonทำให้เกิดปัญหา

คุ้มค่าการตรวจสอบ: ในpackage.jsonการเปลี่ยนแปลง:

homepage: "www.example.com"

ถึง

hompage: ""   

-2

หากบุคคลอื่นใช้การดึงข้อมูลจากเอกสาร "การใช้การดึงข้อมูล" บน Web API ใน Mozilla: (สิ่งนี้มีประโยชน์จริง ๆ : 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;มันใช้ได้


-7

โทเค็นที่ไม่คาดคิด <ใน JSON ที่ตำแหน่ง 0

ทางออกที่ง่ายสำหรับข้อผิดพลาดนี้คือการเขียนความคิดเห็นในstyles.lessไฟล์


48
นี่เป็นหนึ่งในคำตอบที่แปลกประหลาดที่สุดที่ฉันเคยเห็นใน Stackoverflow
Kevin Leary

สวัสดี! เมื่อโพสต์ความคิดเห็นตรวจสอบให้แน่ใจว่ามันใช้ได้กับคำถามจริงที่ถูกถาม คำตอบของคุณน่าจะดีกว่านี้ถ้าคุณบอกเราว่าเหตุใดการเขียนความคิดเห็นลงในstyles.lessไฟล์อาจแก้ปัญหาที่ดูเหมือนว่าเป็นปัญหาของรหัสเซิร์ฟเวอร์แบ็คเอนด์
Andrew Gray
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.