Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด:


193

ฉันใช้งาน AJAX ในสคริปต์ MooTools ของฉันมันใช้งานได้ดีใน Firefox แต่ใน Chrome ฉันได้รับUncaught SyntaxError: Unexpected token :ข้อผิดพลาดฉันไม่สามารถระบุสาเหตุได้ การใส่ความคิดเห็นให้กับโค้ดเพื่อกำหนดว่าโค้ดที่ไม่ดีนั้นไม่ได้ให้ผลลัพธ์อะไรฉันคิดว่าอาจเป็นปัญหากับ JSON ที่ส่งคืน การตรวจสอบในคอนโซลฉันเห็น JSON ที่ส่งคืนคือ:

{"votes":47,"totalvotes":90}

ฉันไม่เห็นปัญหาใด ๆ กับมันทำไมข้อผิดพลาดนี้จะเกิดขึ้น?

vote.each(function(e){
  e.set('send', {
    onRequest : function(){
      spinner.show();
    },
    onComplete : function(){
      spinner.hide();
    },
    onSuccess : function(resp){
      var j = JSON.decode(resp);
      if (!j) return false;
      var restaurant = e.getParent('.restaurant');
      restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
      $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
      buildRestaurantGraphs();
    }
  });

  e.addEvent('submit', function(e){
    e.stop();
    this.send();
  });
});

1
JSON ไม่เป็นไร ปัญหาน่าจะเป็นวิธีที่คุณจัดการกับมัน การแสดงรหัสจะช่วยได้
tcooc

1
เพิ่มส่วนของรหัสลงในคำถาม
trobrock

ดูเหมือนจะไม่มีอะไรผิดปกติกับไวยากรณ์ JS หรือ JSON การโพสต์กรณีทดสอบที่ไม่ทำงานบน jsfiddle.net อาจช่วยได้ - รวมถึง HTML
Oskar Krawczyk

1
ขณะนี้ฉันกำลังแชร์อินเทอร์เน็ตเพื่อให้โมเด็มของฉันบีบอัดแหล่งที่มา HTML ของเว็บไซต์ที่ฉันเรียกดูดังนั้นฉันจึงไม่สามารถทำหัวหรือก้อยออกจากรหัสได้ แต่สำหรับผู้เริ่มใส่รหัส JS ทุกตัวในไฟล์ภายนอกซึ่งจะทำให้การดีบักง่ายขึ้นเสมอ - คุณจะรู้ว่าสภาพอากาศข้อผิดพลาดเกิดจาก JS หรืออย่างอื่น
Oskar Krawczyk

2
"โทเค็นที่ไม่คาดคิด" น่าจะเป็นรหัสอักขระบางตัวที่ผิดกฎหมาย รหัสดังกล่าวไม่น่าจะปรากฏขึ้นเมื่อคุณพิมพ์ไปยังคอนโซล ดังนั้นพิมพ์สตริงหนึ่งตัวอักษรในแต่ละครั้งหรือใช้ตัววิเคราะห์โปรโตคอลหรือดีบักเกอร์ ฯลฯ เพื่อดูไบต์ที่แท้จริงของสตริง
GroovyDotCom

คำตอบ:


94

เห็นข้อผิดพลาดสีแดง

Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด <

ในแท็บคอนโซลนักพัฒนาซอฟต์แวร์ Chrome เป็นข้อบ่งชี้ของ HTML ในเนื้อหาการตอบกลับ

สิ่งที่คุณเห็นจริง ๆ คือปฏิกิริยาของเบราว์เซอร์ที่มีต่อสิ่งที่คาดไม่ถึง<!DOCTYPE html>จากเซิร์ฟเวอร์


4
ผมมีความคิดว่าทำไมคุณกำลังพูดคุยเกี่ยวกับ "โทเค็นที่ไม่คาดคิด <" Unexpected token :ไม่เมื่อคำถามเป็นเรื่องเกี่ยวกับ คำตอบของคุณไม่เกี่ยวข้องกับปัญหาของ OP อย่างสมบูรณ์
MichałPerłakowski

1
และฉันจะแก้ไขได้อย่างไร ฉันมี php redirect ซึ่งเป็นสาเหตุของสิ่งนี้ใน Chrome
ทำงานเพื่อหาเลี้ยงชีพ

7
ในการเพิ่ม @andy_magoon ในกรณีของฉันฉันมีแท็กสคริปต์ที่ควรจะให้บริการจาวาสคริปต์ แต่เนื่องจากคำขอถูกเปลี่ยนเส้นทางไปยังหน้า HTML (ไม่สำคัญว่าทำไมมันถูกเปลี่ยนเส้นทาง) ซึ่งเริ่มต้นด้วย <! DOCTYPE html > ซึ่งไม่ใช่จาวาสคริปต์ที่ถูกต้องเบราว์เซอร์จะคืนค่า SyntaxError เมื่อพยายามแยก HTML เป็น JS
david.barkhuizen

2
@ วิธีในการแก้ไขคือตรวจสอบให้แน่ใจว่า HTTP ได้รับคืนไฟล์ javascript ที่คุณต้องการไม่ใช่ HTML ที่ไม่คาดคิด
david.barkhuizen

1
ฉันได้รับข้อผิดพลาดนี้เพราะตามที่ปรากฎเส้นทางของไฟล์ไม่ถูกต้องและไม่พบไฟล์ที่ระบุในแท็กสคริปต์
นิวแมน

80

แค่ FYI สำหรับผู้ที่อาจมีปัญหาเดียวกัน - ฉันต้องทำให้เซิร์ฟเวอร์ของฉันส่ง JSON กลับมาเป็น application / json และ jQuery handler เริ่มต้นทำงานได้ดี


4
ฉันคิดว่าฉันมีปัญหากลับกัน ฉันกำลังร้องขอ JSON จาก API ของบุคคลที่สามและพวกเขากำลังคืนแอปพลิเคชัน / javascript เป็นการตอบสนองและฉันได้รับข้อผิดพลาดเดียวกับที่คุณรายงานไว้ในคำถามนี้ ไม่แน่ใจว่าจะจัดการกับมันอย่างไร
wuliwong

5
ปัญหาที่แปลกคือ - มันทำงานได้ดีบน localhost แต่ไม่ได้อยู่บนเซิร์ฟเวอร์ มีความคิดอะไรไหม
VishwaKumar

สวัสดี. ฉันมีปัญหาที่แน่นอนและฉันไม่สามารถแก้ปัญหาได้มีคนบอกฉันว่าคุณส่ง JSON กลับไปที่เซิร์ฟเวอร์ได้อย่างไร
Alen

ขอบคุณฉันส่ง application / javascript (เพราะฉันอ่านผิดนี้ ) และได้รับข้อผิดพลาดนี้จาก JSON ที่ใช้งานง่าย เปลี่ยนเป็นapplication/jsonแก้ไขข้อผิดพลาด ฉันไม่ได้ใช้ JSONP
scipilot

แม้ฉันจะได้รับข้อผิดพลาดเดียวกัน "Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด:" แม้หลังจากได้รับการตอบสนองในรูปแบบ json {"สำเร็จ": จริง "ข้อมูล": 2593}
Rupali Pemare

41

นี่เพิ่งเกิดขึ้นกับฉันและเหตุผลก็คือไม่มีเหตุผลข้างต้น ฉันใช้คำสั่ง jQuery getJSON และเพิ่มcallback=?การใช้ JSONP (เพราะฉันต้องการข้ามโดเมน) และส่งคืนรหัส JSON {"foo":"bar"}และรับข้อผิดพลาด

นี่เป็นเพราะฉันควรจะรวมข้อมูลการโทรกลับบางอย่างเช่น jQuery17209314005577471107_1335958194322({"foo":"bar"})

นี่คือรหัส PHP ที่ฉันใช้เพื่อให้บรรลุซึ่งลดระดับถ้าใช้ JSON (ไม่มีการเรียกกลับ):

$ret['foo'] = "bar";
finish();

function finish() {
    header("content-type:application/json");
    if ($_GET['callback']) {
        print $_GET['callback']."(";
    }
    print json_encode($GLOBALS['ret']);
    if ($_GET['callback']) {
        print ")";
    }
    exit; 
}

หวังว่าจะช่วยใครซักคนในอนาคต


มันช่วยฉันได้มาก เราควรห่อข้อมูล json ด้วยข้อมูล jsoncallback ทุกครั้งที่เราใช้เมธอด jsonp นอกจากนี้ข้อมูล jsonpcallback ไม่ควรเริ่มต้นด้วยตัวเลข เมื่อฉันลองตัวเลขมันไม่ได้ผล เมื่อฉันลองด้วยรูปแบบเดียวกันที่แสดงในคำตอบนี้มันใช้งานได้ ...
Ganesh Babu

เป็นจริงเพียงพอ แต่ข้อผิดพลาดจะเหมือนกันและรหัสจะลดลงอย่างงดงามและยังคงใช้งานได้หากใช้ JSON
กลัว ...

สิ่งนี้ใช้ได้กับฉันด้วย AJAX, jQuery & JSONP ขอบคุณมาก!
Piotr Wittchen

16

ฉันเพิ่งจะแก้ไขปัญหา มีบางสิ่งที่ทำให้เกิดปัญหากับการเรียกการร้องขอมาตรฐานดังนั้นนี่คือรหัสที่ฉันใช้แทน:

vote.each(function(element){                
  element.addEvent('submit', function(e){
    e.stop();
    new Request.JSON({
      url : e.target.action, 
      onRequest : function(){
        spinner.show();
      },
      onComplete : function(){
        spinner.hide();
      },
      onSuccess : function(resp){
        var j = resp;
        if (!j) return false;
        var restaurant = element.getParent('.restaurant');
        restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
        $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
        buildRestaurantGraphs();
      }
    }).send(this);
  });
});

หากใครรู้ว่าทำไมคำขอวัตถุมาตรฐานทำให้ฉันมีปัญหาฉันก็อยากจะรู้


3
ความแตกต่างระหว่างคำขอมาตรฐานกับ request.json ส่วนใหญ่จะอยู่ในส่วนหัวthis.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- เพิ่มรูป go
Dimitar Christoff

แปลกที่นั่นคือสิ่งที่ทำให้เกิดปัญหากับเรื่องนี้
trobrock

3
มีสองเท่า$$อะไร
falsarella

@DimitarChristoff - คำตอบใด ๆ สำหรับ falsarella เกี่ยวกับ $$?
แบก

1
@bear ตัวเลือกดอลล่าร์ดับเบิลถูกกำหนดใน MooTools
Anthony Faull

10

ฉันคิดว่าฉันจะเพิ่มปัญหาและความละเอียดของฉันลงในรายการ

ฉันได้รับ: Uncaught SyntaxError: Unexpected token <และข้อผิดพลาดชี้ไปที่บรรทัดนี้ในแถลงการณ์ความสำเร็จของ ajax ของฉัน:

var total = $.parseJSON(response);

ฉันภายหลังพบว่านอกเหนือจากผลลัพธ์ json มี HTML ที่ถูกส่งไปพร้อมกับคำตอบเพราะฉันมีข้อผิดพลาดใน PHP ของฉัน เมื่อคุณได้รับข้อผิดพลาดใน PHP คุณสามารถตั้งค่าให้เตือนคุณด้วยตารางสีส้มขนาดใหญ่และตารางเหล่านั้นคือสิ่งที่ถูกโยนออกจาก JSON

ฉันพบว่าเพียงแค่ทำconsole.log(response)เพื่อดูสิ่งที่ถูกส่งจริง หากเป็นปัญหาเกี่ยวกับข้อมูล JSON เพียงลองดูว่าคุณสามารถทำ console.log หรือข้อความอื่น ๆ ที่จะช่วยให้คุณเห็นสิ่งที่ถูกส่งและสิ่งที่ได้รับ


1
ฉันทำอย่างนี้. ฉันกำลังสะท้อน json บางไฟล์ inmy php และกำลังรับ php [// json data] ในการตอบกลับของฉัน แต่ฉันไม่สามารถแยกวิเคราะห์ได้ ขอบคุณที่โพสต์ข้อความนี้เพื่อที่ฉันจะได้เข้าใจถึงความผิดพลาดของตัวเอง
Nicholas Decker

ปัญหา OP แตกต่างอย่างสิ้นเชิง ในกรณีของคุณคุณกำลังพยายามแยก HTML เป็น JSON และในกรณีของ OP เขากำลังพยายามแยก JSON เป็น JavaScript
MichałPerłakowski

7

เมื่อคุณร้องขอไฟล์ JSON ของคุณเซิร์ฟเวอร์จะส่งคืนContent-Typeส่วนหัวJavaScript ( text/javascript) แทน JSON ( application/json)

ตามเอกสาร MooTools :

การตอบสนองด้วย javascript content-type จะถูกประเมินโดยอัตโนมัติ

ผลลัพธ์ MooTools พยายามประเมิน JSON ของคุณเป็น JavaScript และเมื่อคุณพยายามประเมิน JSON ดังกล่าว:

{"votes":47,"totalvotes":90}

ในฐานะ JavaScript, parser ปฏิบัติต่อ{และ}เป็นขอบเขตบล็อกแทนที่จะเป็นสัญลักษณ์ของวัตถุ มันเหมือนกับการประเมิน "รหัส" ต่อไปนี้:

"votes":47,"totalvotes":90

อย่างที่คุณเห็น:มันเป็นสิ่งที่คาดไม่ถึง

ทางออกคือการตั้งค่าContent-Typeส่วนหัวที่ถูกต้องสำหรับไฟล์ JSON หากคุณบันทึกด้วย.jsonส่วนขยายเซิร์ฟเวอร์ของคุณควรทำด้วยตัวเอง


4

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

var resp = '{"votes":47,"totalvotes":90}';
eval(resp);

นี่คือสาเหตุที่วงเล็บปีกกา '{... }' ถูกตีความโดยจาวาสคริปต์เป็นบล็อกรหัสและไม่ใช่วัตถุตามตัวอักษรอย่างที่คาดไว้

ฉันจะดูที่ฟังก์ชัน JSON.decode () และดูว่ามี eval อยู่หรือไม่

ปัญหาที่คล้ายกันที่นี่: Eval () = โทเค็นที่ไม่คาดคิด: ข้อผิดพลาด


2

หากไม่มีสิ่งใดเหมาะสมข้อผิดพลาดนี้อาจเกิดจากข้อผิดพลาด PHP ที่ฝังอยู่ภายใน html / javascript เช่นด้านล่าง

<br />
<b>Deprecated</b>:  mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in <b>C:\Projects\rwp\demo\en\super\ge.php</b> on line <b>54</b><br />
var zNodes =[{ id:1, pId:0, name:"ACE", url: "/ace1.php", target:"_self", open:true}

ไม่ได้<br />ฯลฯ ในรหัสที่ถูกแทรกลงใน html ทุกชนิดที่เป็นสาเหตุของข้อผิดพลาด ในการแก้ไขข้อผิดพลาดประเภทนี้ (ระงับการเตือน) ให้ใช้รหัสนี้ในการเริ่มต้น

error_reporting(E_ERROR | E_PARSE);

หากต้องการดูคลิกขวาที่หน้า "ดูแหล่งที่มา" จากนั้นตรวจสอบ html ที่สมบูรณ์เพื่อดูข้อผิดพลาดนี้


1

ข้อผิดพลาด" Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด " เมื่อข้อมูลของคุณกลับมาในรูปแบบ json ที่ไม่ถูกต้องในบางกรณีคุณไม่ทราบว่าคุณมีรูปแบบ json ที่ไม่ถูกต้อง
โปรดตรวจสอบด้วยการแจ้งเตือน (); ฟังก์ชัน

onSuccess : function(resp){  
   alert(resp);  
}

ข้อความที่ได้รับควรเป็น: {"firstName": "John", "lastName": "Doe"}
จากนั้นคุณสามารถใช้รหัสด้านล่าง

onSuccess : function(resp){  
   var j = JSON.decode(resp); // but in my case i'm using: JSON.parse(resp); 
}

โดยไม่มีข้อผิดพลาด " Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด "
แต่ถ้าคุณได้รับรูปแบบ json ผิด
เช่น:

... {"firstName": "John", "lastName": "Doe"}

หรือ

Undefined variable: errCapt in .... on line<b>65</b><br/>{"firstName":"John", "lastName":"Doe"}

เพื่อให้คุณมีรูปแบบ json ที่ไม่ถูกต้องโปรดแก้ไขก่อน JSON.decode หรือ JSON.parse


3
ฉันแนะนำให้ใช้console.log()แทนalert()การดีบัก
MichałPerłakowski

1

สิ่งนี้เกิดขึ้นกับฉันในวันนี้เช่นกัน ฉันใช้ EF และส่งคืน Entity เพื่อตอบสนองต่อการโทร AJAX คุณสมบัติเสมือนจริงในเอนทิตีของฉันทำให้เกิดข้อผิดพลาดในการขึ้นต่อกันของวัฏจักรที่ไม่ถูกตรวจพบบนเซิร์ฟเวอร์ โดยการเพิ่มแอตทริบิวต์ [ScriptIgnore] บนคุณสมบัติเสมือนปัญหาได้รับการแก้ไข

แทนที่จะใช้แอ็ตทริบิวต์ ScriptIgnore มันคงจะดีกว่าถ้าคุณส่งคืน DTO


1

สิ่งนี้เกิดขึ้นเพราะฉันมีการตั้งค่ากฎในเซิร์ฟเวอร์ด่วนเพื่อกำหนดเส้นทาง 404 ใด ๆ กลับไป/#รวมกับสิ่งที่คำขอเดิมคือ การอนุญาตให้เราเตอร์เชิงมุม / js จัดการการร้องขอ หากไม่มีเส้นทาง js ในการจัดการเส้นทางนั้นคำขอไป/#/whateverยังเซิร์ฟเวอร์ซึ่งเป็นเพียงคำขอสำหรับ/หน้าเว็บทั้งหมด

ตัวอย่างเช่นถ้าฉันต้องการที่จะขอ/correct/somejsfile.jsแต่ฉันพลาดพิมพ์มันไป/wrong/somejsfile.jsยังคำขอที่ทำกับเซิร์ฟเวอร์ สถานที่ที่ / 302 location: /#/wrong/somejsfile.jsไฟล์ไม่ได้อยู่เพื่อตอบสนองเซิร์ฟเวอร์ที่มี เบราว์เซอร์ติดตามการเปลี่ยนเส้นทางอย่างมีความสุขและส่งคืนหน้าเว็บทั้งหมด เบราว์เซอร์จะวิเคราะห์หน้าเป็น js และคุณจะได้รับ

Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด <

ดังนั้นเพื่อช่วยค้นหาเส้นทาง / คำขอที่ละเมิดให้ค้นหา 302 คำขอ

หวังว่าจะช่วยใครซักคน


1

ฉันมีปัญหาเดียวกันและปรากฎว่า Json ที่ส่งคืนจากเซิร์ฟเวอร์ไม่ถูกต้อง Json-P หากคุณไม่ได้ใช้การโทรเป็นการโทรข้ามโดเมนให้ใช้ Json ปกติ


OP ใช้ JSON ไม่ใช่ JSONP
MichałPerłakowski

0

ฉันได้รับ " SyntaxError: Unexpected token I" เมื่อฉันเคยjQuery.getJSON()พยายามลดค่าเลขทศนิยมที่Infinityเข้ารหัสINFซึ่งเป็นสิ่งผิดกฎหมายใน JSON


1
คำถามนี้เกี่ยวกับ "โทเค็นที่ไม่คาดคิด: "
MichałPerłakowski

0

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

@RequestMapping(name="/private/updatestatus")

ฉันเปลี่ยนการจับคู่ด้านบนเป็น

 @RequestMapping("/private/updatestatus")

หรือ

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)

0

สำหรับฉันหลอดไฟทำงานต่อเมื่อฉันดูแหล่งที่มาไปยังหน้าภายในเบราว์เซอร์ Chrome ฉันมีวงเล็บพิเศษในคำสั่ง if คุณจะเห็นวงกลมสีแดงพร้อมกากบาทอยู่บนเส้นที่ล้มเหลวทันที มันเป็นข้อความแสดงข้อผิดพลาดที่ค่อนข้างไม่มีประโยชน์เนื่องจากข้อผิดพลาดของ Uncaught Syntax: โทเค็นที่ไม่คาดคิดทำให้ไม่มีการอ้างอิงถึงหมายเลขบรรทัดเมื่อปรากฏครั้งแรกในคอนโซลของ Chrome


0

ฉันทำผิดในเรื่องนี้

   `var  fs = require('fs');
    var fs.writeFileSync(file, configJSON);`

ฉันก็fsปรับค่าตัวแปรให้varเอียง แต่อีกครั้งฉันใส่ในบรรทัดที่สองอันนี้ก็ให้ข้อผิดพลาดชนิดนั้น ...


0

สำหรับผู้ที่ประสบปัญหานี้ใน AngularJs 1.4.6 หรือที่คล้ายกันปัญหาของฉันคือการหามุมที่ไม่พบแม่แบบของฉันเพราะไม่พบไฟล์ที่templateUrl(เส้นทาง) ที่ฉันให้ไว้ ฉันแค่ต้องให้เส้นทางที่เข้าถึงได้และปัญหาก็หายไป


ฉันแก้ไขปัญหาเดียวกันโดยแก้ไข urb baseref - ชี้ไปที่โฟลเดอร์รูท => <base href = "/">
Abdeali Chandanwala

0

ในกรณีของฉันมันเป็น url ที่ผิดพลาด (ไม่มีอยู่) ดังนั้นบางที 'send' ของคุณในบรรทัดที่สองควรเป็นอื่น ...


0

ความผิดพลาดของฉันคือลืมคำพูดเดี่ยว / คู่ประมาณ url ใน javascript:

เพื่อให้ผิดรหัสคือ:

window.location = https://google.com;

และรหัสที่ถูกต้อง :

window.location = "https://google.com";

-2

Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด}

Chrome ทำให้ฉันมีข้อผิดพลาดสำหรับโค้ดตัวอย่างนี้:

<div class="file-square" onclick="window.location = " ?dir=zzz">
    <div class="square-icon"></div>
    <div class="square-text">zzz</div>
</div>

และแก้ไขมันเพื่อแก้ไข onclick ให้เป็นเช่นนั้น

... onclick="window.location = '?dir=zzz'" ...

แต่ข้อผิดพลาดไม่เกี่ยวกับปัญหา ..


OP ถามถึง "โทเค็นที่ไม่คาดคิด: "
MichałPerłakowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.