Uncaught SyntaxError: Mã thông báo bất ngờ:


193

Tôi đang chạy một cuộc gọi AJAX trong tập lệnh MooTools của mình, điều này hoạt động tốt trong Firefox nhưng trong Chrome tôi đang gặp Uncaught SyntaxError: Unexpected token :lỗi, tôi không thể xác định lý do. Nhận xét mã để xác định nơi mã xấu không mang lại kết quả gì, tôi nghĩ đó có thể là một vấn đề với JSON được trả về. Kiểm tra trong bảng điều khiển tôi thấy JSON được trả về là đây:

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

Tôi không thấy bất kỳ vấn đề nào với nó, tại sao lỗi này lại xảy ra?

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 là tốt. Vấn đề có lẽ là cách bạn xử lý nó. Hiển thị mã sẽ giúp.
tcooc

1
Đã thêm phần mã vào câu hỏi.
trobrock

Dường như không có bất cứ điều gì sai với cú pháp, JS và JSON. Đăng một trường hợp thử nghiệm (không) hoạt động trên jsfiddle.net sẽ giúp ích - bao gồm cả HTML.
Oskar Krawchot

1
Tôi hiện đang kết nối internet để modem của tôi nén nguồn HTML của các trang web tôi duyệt, vì vậy tôi thực sự không thể tạo ra đầu hoặc đuôi ra khỏi mã. Tuy nhiên, đối với người mới bắt đầu, hãy đặt mọi mã JS vào các tệp bên ngoài - điều này luôn giúp việc gỡ lỗi dễ dàng hơn - bạn sẽ biết lỗi thời tiết là do JS hoặc do lỗi khác.
Oskar Krawchot

2
Một "mã thông báo bất ngờ" có khả năng là một số mã ký tự bất hợp pháp. Mã như vậy có khả năng không hiển thị khi bạn in lên bàn điều khiển. Do đó, in ra một ký tự chuỗi một lần hoặc sử dụng trình phân tích giao thức hoặc trình gỡ lỗi, v.v. để xem các byte thực tế của chuỗi.
GroovyDotCom

Câu trả lời:


93

Thấy lỗi đỏ

Uncaught SyntaxError: Mã thông báo bất ngờ <

trong tab bảng điều khiển dành cho nhà phát triển Chrome của bạn là một dấu hiệu của HTML trong phần thân phản hồi.

Những gì bạn thực sự nhìn thấy là phản ứng của trình duyệt của bạn đối với dòng trên cùng bất ngờ <!DOCTYPE html>từ máy chủ.


4
Tôi không biết tại sao bạn lại nói về "Mã thông báo bất ngờ <" khi có câu hỏi Unexpected token :. Câu trả lời của bạn hoàn toàn không liên quan đến vấn đề của OP.
Michał Perłakowski

1
Và làm thế nào để tôi sửa lỗi này? Tôi có một chuyển hướng php đang gây ra điều này trong Chrome.
Hoạt động để kiếm sống vào

7
Để thêm vào @andy_magoon, trong trường hợp của tôi, tôi đã có một thẻ script được cho là để phục vụ javascript, nhưng vì yêu cầu đã được chuyển hướng đến một trang HTML (không quan trọng tại sao nó được chuyển hướng), bắt đầu bằng <! DOCTYPE html >, không phải là javascript hợp lệ, trình duyệt trả về SyntaxError khi nó cố phân tích HTML dưới dạng JS.
david.barkhuizen

2
@Thom Cách khắc phục là đảm bảo rằng HTTP get trả về tệp javascript mà bạn đang tìm và không phải là HTML bất ngờ.
david.barkhuizen

1
Tôi đã nhận chính xác lỗi này bởi vì, hóa ra, đường dẫn tệp không chính xác và nó không thể tìm thấy tệp được chỉ định trong thẻ script.
newman

80

Chỉ là một FYI cho những người có thể có cùng một vấn đề - Tôi chỉ cần làm cho máy chủ của mình gửi lại JSON dưới dạng application / json và trình xử lý jQuery mặc định hoạt động tốt.


4
Tôi nghĩ rằng tôi đang có nghịch đảo của vấn đề này. Tôi đang yêu cầu JSON từ API của bên thứ ba và họ đang trả lại ứng dụng / javascript làm phản hồi và tôi nhận được cùng một lỗi mà bạn đã báo cáo trong câu hỏi này. Không chắc chắn làm thế nào để đối phó với nó.
wuliwong

5
Một vấn đề kỳ lạ là - nó hoạt động tốt trên localhost nhưng không phải trên sever. Bất cứ ý tưởng tại sao?
VishwaKumar

Xin chào. Tôi có vấn đề chính xác và tôi không thể giải quyết nó, ai đó có thể cho tôi biết cách bạn gửi JSON trở lại máy chủ không
Alen

Cảm ơn tôi đã gửi ứng dụng / javascript (vì tôi đã đọc sai SO này ) và đã gặp lỗi này trên JSON hợp lệ đơn giản. Thay đổi nó để application/jsongiải quyết lỗi. Tôi không sử dụng JSONP.
scipilot

Ngay cả tôi cũng nhận được cùng một lỗi "Uncaught SyntaxError: Unken token:", ngay cả sau khi nhận được phản hồi ở định dạng json {"thành công": true, "data": 2593}
Rupali Pemare

41

Điều này vừa xảy ra với tôi, và lý do không phải là lý do ở trên. Tôi đã sử dụng lệnh jQuery getJSON và thêm vào callback=?để sử dụng JSONP (vì tôi cần phải đi tên miền chéo) và trả lại mã JSON {"foo":"bar"}và nhận được lỗi.

Điều này là do tôi nên bao gồm dữ liệu gọi lại, đại loại như jQuery17209314005577471107_1335958194322({"foo":"bar"})

Đây là mã PHP mà tôi đã sử dụng để đạt được điều này, nó sẽ giảm nếu JSON (không có hàm gọi lại) được sử dụng:

$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; 
}

Hy vọng rằng sẽ giúp được ai đó trong tương lai.


Nó đã giúp tôi rất nhiều. Chúng ta nên bọc dữ liệu json bằng dữ liệu jsoncallback bất cứ khi nào chúng ta đang sử dụng phương pháp jsonp. Ngoài ra, dữ liệu jsonpcallback không nên bắt đầu bằng số. Khi tôi thử với những con số, nó đã không thành công. Khi tôi thử nó với định dạng tương tự như trong câu trả lời này, nó đã hoạt động ...
Ganesh Babu

Đúng như vậy, nhưng lỗi là như nhau và mã sẽ xuống cấp một cách duyên dáng và vẫn hoạt động nếu JSON được sử dụng.
Grim ...

Điều này làm việc với tôi với AJAX, jQuery & JSONP. Cảm ơn rất nhiều!
Piotr Wittchen ngày

16

Tôi vừa giải quyết vấn đề. Có vấn đề gây ra với một cuộc gọi Yêu cầu tiêu chuẩn, vì vậy đây là mã tôi đã sử dụng thay thế:

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

Nếu có ai biết tại sao đối tượng Yêu cầu tiêu chuẩn lại gây ra cho tôi các vấn đề thì tôi rất muốn biết.


3
sự khác biệt giữa yêu cầu tiêu chuẩn và request.json chủ yếu nằm ở các tiêu đề, nó bổ sung this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- hình minh họa
Dimitar Christoff

Thật kỳ lạ, đó là những gì đã gây ra vấn đề với điều này.
trobrock

3
Đôi $$ở đó là gì?
falsarella

@DimitarChristoff - bạn có trả lời cho falsarella về $$ không?
chịu

1
@bear Công cụ chọn đô la kép được xác định trong MooTools.
Anthony Faull

10

Tôi nghĩ rằng tôi sẽ thêm vấn đề và giải quyết của tôi vào danh sách.

Tôi đã nhận được: Uncaught SyntaxError: Unexpected token <và lỗi đã chỉ ra dòng này trong tuyên bố thành công ajax của tôi:

var total = $.parseJSON(response);

Sau đó tôi thấy rằng ngoài các kết quả json, đã có HTML được gửi cùng với phản hồi vì tôi có lỗi trong PHP của mình. Khi bạn gặp lỗi trong PHP, bạn có thể đặt nó để cảnh báo bạn bằng các bảng màu cam lớn và các bảng đó là thứ đã làm mất JSON.

Tôi thấy rằng chỉ bằng cách làm một console.log(response) để xem những gì thực sự được gửi đi. Nếu đó là một vấn đề với dữ liệu JSON, chỉ cần thử xem bạn có thể thực hiện console.log hoặc một số câu lệnh khác sẽ cho phép bạn xem những gì được gửi và những gì được nhận.


1
Tôi đã làm điều này. Tôi đã lặp lại json ở đâu đó trong tệp php inmy và nhận được php [// json data] trong phản hồi của tôi nhưng tôi không thể phân tích cú pháp. Cảm ơn đã đăng bài này để tôi có thể tìm ra sai lầm của riêng tôi.
Nicholas Decker

Vấn đề OP là hoàn toàn khác nhau. Trong trường hợp của bạn, bạn đang cố phân tích HTML dưới dạng JSON và trong trường hợp của OP, anh ta đang cố phân tích JSON như JavaScript.
Michał Perłakowski

7

Khi bạn yêu cầu tệp JSON của mình, máy chủ trả về Content-Typetiêu đề JavaScript ( text/javascript) thay vì JSON ( application/json).

Theo tài liệu của MooTools :

Phản hồi với loại nội dung javascript sẽ được đánh giá tự động.

Kết quả là MooTools cố gắng đánh giá JSON của bạn dưới dạng JavaScript và khi bạn cố gắng đánh giá JSON đó:

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

như JavaScript, trình phân tích cú pháp xử lý {}như một phạm vi khối thay vì ký hiệu đối tượng. Nó giống như việc đánh giá "mã" sau:

"votes":47,"totalvotes":90

Bạn có thể thấy, : là hoàn toàn bất ngờ ở đó.

Giải pháp là đặt Content-Typetiêu đề chính xác cho tệp JSON. Nếu bạn lưu nó với .jsonphần mở rộng, máy chủ của bạn sẽ tự làm điều đó.


4

Có vẻ như phản ứng của bạn đang được đánh giá bằng cách nào đó. Điều này cho cùng một lỗi trong Chrome:

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

Điều này là do các dấu ngoặc nhọn '{...}' được javascript diễn giải dưới dạng một khối mã chứ không phải là một đối tượng theo nghĩa đen như người ta mong đợi.

Tôi sẽ xem xét hàm JSON.decode () và xem liệu có một eval trong đó không.

Vấn đề tương tự ở đây: Eval () = Mã thông báo không mong muốn: lỗi


2

Nếu không có ý nghĩa gì, lỗi này cũng có thể do Lỗi PHP được nhúng bên trong html / javascript, chẳng hạn như lỗi bên dưới

<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}

Không phải <br />vv trong mã được chèn vào html bởi PHP đang gây ra lỗi . Để khắc phục loại lỗi này (cảnh báo triệt tiêu), hãy sử dụng mã này khi bắt đầu

error_reporting(E_ERROR | E_PARSE);

Để xem, nhấp chuột phải vào trang, "xem nguồn" và sau đó kiểm tra html hoàn chỉnh để phát hiện lỗi này.


1

Lỗi " Uncaught SyntaxError: Mã thông báo không mong đợi " xuất hiện khi dữ liệu của bạn trả lại định dạng json sai, trong một số trường hợp, bạn không biết mình đã nhận sai định dạng json.
vui lòng kiểm tra nó với cảnh báo (); chức năng

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

tin nhắn của bạn nhận được phải là: {"firstName": "John", "lastName": "Doe"}
và sau đó bạn có thể sử dụng mã bên dưới

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

không có lỗi " Uncaught SyntaxError: Unken token "
nhưng nếu bạn nhận được định dạng json sai
ex:

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

hoặc là

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

để bạn có định dạng json sai, vui lòng sửa nó trước khi bạn JSON.decode hoặc JSON.parse


3
Tôi khuyên bạn nên sử dụng console.log()thay vì alert()để gỡ lỗi.
Michał Perłakowski

1

Điều này đã xảy ra với tôi ngày hôm nay là tốt. Tôi đã sử dụng EF và trả lại một Thực thể để đáp lại cuộc gọi AJAX. Các thuộc tính ảo trên thực thể của tôi đã gây ra lỗi phụ thuộc theo chu kỳ không được phát hiện trên máy chủ. Bằng cách thêm thuộc tính [ScriptIgnore] vào các thuộc tính ảo, sự cố đã được khắc phục.

Thay vì sử dụng thuộc tính ScriptIgnore, có lẽ tốt hơn là chỉ trả lại DTO.


1

Điều này xảy ra là do tôi có một thiết lập quy tắc trong máy chủ cấp tốc của mình để định tuyến bất kỳ 404 nào trở lại /#cộng với bất kỳ yêu cầu ban đầu nào. Cho phép bộ định tuyến góc / js để xử lý yêu cầu. Nếu không có tuyến đường js để xử lý đường dẫn đó, một yêu cầu /#/whateverđược gửi đến máy chủ, đó chỉ là một yêu cầu cho/ toàn bộ trang web.

Vì vậy, ví dụ nếu tôi muốn thực hiện một yêu cầu /correct/somejsfile.jsnhưng tôi đã gõ nó vào /wrong/somejsfile.jsyêu cầu được gửi đến máy chủ. Vị trí / tệp đó không tồn tại, vì vậy máy chủ phản hồi với a 302 location: /#/wrong/somejsfile.js. Trình duyệt vui vẻ làm theo chuyển hướng và toàn bộ trang web được trả lại. Trình duyệt phân tích trang dưới dạng js và bạn nhận được

Uncaught SyntaxError: Mã thông báo bất ngờ <

Vì vậy, để giúp tìm đường dẫn / yêu cầu vi phạm, hãy tìm 302 yêu cầu.

Hy vọng rằng sẽ giúp được ai đó.


1

Tôi có cùng một vấn đề và hóa ra Json trở về từ máy chủ không hợp lệ Json-P. Nếu bạn không sử dụng cuộc gọi như một cuộc gọi liên vùng, hãy sử dụng Json thông thường.


OP sử dụng JSON, không phải JSONP.
Michał Perłakowski

0

Tôi đã nhận được một " SyntaxError: Unexpected token I" khi tôi jQuery.getJSON()cố gắng hủy tuần tự hóa một giá trị dấu phẩy động Infinity, được mã hóa thành INF, bất hợp pháp trong JSON.


1
Câu hỏi này là về "Mã thông báo bất ngờ : ".
Michał Perłakowski

0

Trong trường hợp của tôi, tôi gặp lỗi tương tự, trong khi chạy ứng dụng mvc mùa xuân do ánh xạ sai trong bộ điều khiển mvc của tôi

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

tôi đã thay đổi ánh xạ trên thành

 @RequestMapping("/private/updatestatus")

hoặc là

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

0

Đối với tôi, bóng đèn bật sáng khi tôi xem nguồn tới trang bên trong trình duyệt Chrome. Tôi đã có một khung thêm trong một tuyên bố if. Bạn sẽ ngay lập tức nhìn thấy vòng tròn màu đỏ với một chữ thập trong đó trên dòng thất bại. Đó là một thông báo lỗi khá hữu ích, bởi vì Lỗi cú pháp Uncaught: Mã thông báo không mong muốn không tham chiếu đến số dòng khi lần đầu tiên xuất hiện trong bảng điều khiển của Chrome.


0

Tôi đã làm sai trong việc này

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

Tôi đã nội tâm hóa fsbiến. Nhưng một lần nữa tôi đặt varvào dòng thứ hai. Cái này cũng cho loại lỗi đó ...


0

Đối với những người gặp phải điều này trong AngularJs 1.4.6 hoặc tương tự, vấn đề của tôi là do góc không tìm thấy mẫu của tôi vì tệp ở templateUrlđường dẫn tôi cung cấp không thể tìm thấy. Tôi chỉ cần cung cấp một con đường có thể tiếp cận và vấn đề đã biến mất.


tôi đã giải quyết vấn đề tương tự bằng cách sửa url baseref - trỏ vào thư mục gốc => <base href = "/">
Abdeali Chandanwala

0

Trong trường hợp của tôi, đó là một url nhầm (không tồn tại), vì vậy có lẽ 'gửi' trong dòng thứ hai của bạn phải là ...


0

Sai lầm của tôi là quên báo giá đơn / đôi xung quanh url trong javascript:

nên sai mã đã:

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

và mã chính xác :

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

-2

Uncaught SyntaxError: Mã thông báo bất ngờ}

Chrome đã báo lỗi cho tôi về mã mẫu này:

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

và giải quyết nó sửa lỗi onclick giống như

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

Nhưng lỗi không liên quan đến vấn đề ..


OP đã hỏi về "Mã thông báo bất ngờ : ".
Michał Perłakowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.