Uncaught SyntaxError: Token tak terduga:

193

Saya menjalankan panggilan AJAX di skrip MooTools saya, ini berfungsi dengan baik di Firefox tetapi di Chrome saya mendapatkan Uncaught SyntaxError: Unexpected token :kesalahan, saya tidak bisa menentukan alasannya. Mengomentari kode untuk menentukan di mana kode yang buruk menghasilkan apa-apa, saya pikir itu mungkin masalah dengan JSON yang dikembalikan. Memeriksa di konsol saya melihat JSON kembali adalah ini:

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

Saya tidak melihat masalah dengan itu, mengapa kesalahan ini terjadi?

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();
  });
});
trobrock
sumber
1
JSON baik-baik saja. Masalahnya mungkin bagaimana Anda menanganinya. Menampilkan kode akan membantu.
tcooc
1
Menambahkan bagian kode ke pertanyaan.
trobrock
Sepertinya tidak ada yang salah dengan sintaks, JS atau JSON. Memposting case test yang berfungsi (tidak) di jsfiddle.net akan membantu - termasuk HTML.
Oskar Krawczyk
1
Saat ini saya sedang menambatkan internet sehingga modem saya mengompresi sumber HTML dari situs web yang saya jelajahi, jadi saya tidak bisa benar-benar membuat kepala atau ekor keluar dari kode. Tapi, sebagai permulaan, letakkan setiap kode JS dalam file eksternal - ini selalu membuat proses debug lebih mudah - Anda akan tahu jika kesalahan disebabkan oleh JS atau hal lainnya.
Oskar Krawczyk
2
"Token tak terduga" kemungkinan beberapa kode karakter ilegal. Kode semacam itu kemungkinan tidak akan muncul saat Anda mencetak ke konsol. Oleh karena itu, cetak string karakter satu per satu atau gunakan penganalisa protokol atau debugger dll untuk melihat byte sebenarnya dari string.
GroovyDotCom

Jawaban:

93

Melihat kesalahan merah

Uncaught SyntaxError: Token yang tidak terduga <

di tab konsol pengembang Chrome Anda merupakan indikasi HTML di badan respons.

Apa yang sebenarnya Anda lihat adalah reaksi browser Anda terhadap baris teratas yang tidak terduga <!DOCTYPE html>dari server.

andy magoon
sumber
4
Saya tidak tahu mengapa Anda berbicara tentang "Token yang tidak terduga <" ​​ketika pertanyaan tentang Unexpected token :. Jawaban Anda sama sekali tidak terkait dengan masalah OP.
Michał Perłakowski
1
Dan bagaimana cara memperbaikinya? Saya memiliki redirect php yang menyebabkan ini di Chrome.
Bekerja untuk Hidup
7
Untuk menambahkan ke @andy_magoon, dalam kasus saya, saya memiliki tag skrip yang seharusnya melayani javascript, tetapi karena permintaan dialihkan ke halaman HTML (tidak penting mengapa dialihkan), yang dimulai dengan <! DOCTYPE html >, yang bukan javascript yang valid, browser mengembalikan SyntaxError ketika ia mencoba untuk mem-parsing HTML sebagai JS.
david.barkhuizen
2
@Thom Cara untuk memperbaikinya adalah memastikan bahwa HTTP dapat mengembalikan file javascript yang Anda cari, dan bukan HTML yang tidak terduga.
david.barkhuizen
1
Saya mendapatkan kesalahan ini karena, ternyata jalur file salah dan tidak dapat menemukan file yang ditentukan dalam tag skrip.
pemain baru
80

Hanya FYI untuk orang-orang yang mungkin memiliki masalah yang sama - Saya hanya harus membuat server saya mengirim kembali JSON sebagai aplikasi / json dan penangan default jQuery bekerja dengan baik.

Edward Abrams
sumber
4
Saya pikir saya memiliki kebalikan dari masalah ini. Saya meminta JSON dari API pihak ketiga dan mereka mengembalikan aplikasi / javascript sebagai tanggapan dan saya mendapatkan kesalahan yang sama seperti yang Anda laporkan dalam pertanyaan ini. Tidak yakin bagaimana menghadapinya.
wuliwong
5
Masalah aneh adalah - itu berfungsi dengan baik di localhost tetapi tidak di server. Ada yang tahu kenapa?
VishwaKumar
Halo. Saya punya masalah yang pasti dan saya tidak bisa menyelesaikannya, dapatkah seseorang memberi tahu saya bagaimana Anda mengirim JSON kembali ke server
Alen
Terima kasih saya mengirim aplikasi / javascript (karena saya salah membaca SO ini ) dan mendapatkan kesalahan ini pada JSON valid sederhana. Mengubahnya untuk application/jsonmenyelesaikan kesalahan. Saya tidak menggunakan JSONP.
scipilot
Bahkan saya mendapatkan kesalahan yang sama "Uncaught SyntaxError: Token tak terduga:", bahkan setelah menerima respons dalam format json {"success": true, "data": 2593}
Rupali Pemare
41

Ini baru saja terjadi pada saya, dan alasannya tidak ada alasan di atas. Saya menggunakan perintah jQuery getJSON dan menambahkan callback=?untuk menggunakan JSONP (karena saya harus pergi lintas domain), dan mengembalikan kode JSON {"foo":"bar"}dan mendapatkan kesalahan.

Ini karena saya harus memasukkan data panggilan balik, semacamnya jQuery17209314005577471107_1335958194322({"foo":"bar"})

Berikut adalah kode PHP yang saya gunakan untuk mencapai ini, yang menurunkan jika JSON (tanpa panggilan balik) digunakan:

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

Semoga itu akan membantu seseorang di masa depan.

Suram...
sumber
Itu banyak membantu saya. Kita harus membungkus data json dengan data jsoncallback setiap kali kita menggunakan metode jsonp. Juga data jsonpcallback tidak boleh dimulai dengan angka. Ketika saya mencoba dengan angka, itu tidak berhasil. Ketika saya mencobanya dengan format yang sama seperti yang ditunjukkan dalam jawaban ini, ternyata berhasil ...
Ganesh Babu
Cukup benar, tetapi kesalahannya sama dan kodenya akan menurun dengan anggun dan masih berfungsi jika JSON sedang digunakan.
Suram ...
Ini bekerja untuk saya dengan AJAX, jQuery & JSONP. Terima kasih banyak!
Piotr Wittchen
16

Saya baru saja menyelesaikan masalah. Ada sesuatu yang menyebabkan masalah dengan panggilan Permintaan standar, jadi ini adalah kode yang saya gunakan sebagai gantinya:

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

Jika ada yang tahu mengapa objek Permintaan standar memberi saya masalah, saya ingin tahu.

trobrock
sumber
3
perbedaan antara permintaan standar dan request.json sebagian besar di header, tambahnya this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- go figure
Dimitar Christoff
Aneh bahwa itulah yang menyebabkan masalah dengan ini.
trobrock
3
Apa ganda $$sana?
falsarella
@DimitarChristoff - ada jawaban untuk falsarella tentang $$?
melahirkan
1
@ bear Pemilih dolar ganda didefinisikan dalam Mootools.
Anthony Faull
10

Saya pikir saya akan menambahkan masalah dan resolusi saya ke daftar.

Saya mendapatkan: Uncaught SyntaxError: Unexpected token <dan kesalahan menunjuk ke baris ini dalam pernyataan sukses ajax saya:

var total = $.parseJSON(response);

Saya kemudian menemukan bahwa selain hasil json, ada HTML yang dikirim dengan respons karena saya memiliki kesalahan dalam PHP saya. Ketika Anda mendapatkan kesalahan dalam PHP Anda dapat mengaturnya untuk memperingatkan Anda dengan tabel oranye besar dan tabel-tabel itulah yang membuang JSON.

Saya menemukan itu dengan hanya melakukan console.log(response)untuk melihat apa yang sebenarnya dikirim. Jika masalah dengan data JSON, coba lihat apakah Anda dapat melakukan console.log atau pernyataan lain yang memungkinkan Anda melihat apa yang dikirim dan apa yang diterima.

Keven
sumber
1
Saya melakukan ini. Saya menggemakan json di suatu tempat di file php saya dan mendapatkan php [// json data] dalam respons saya, tetapi saya tidak dapat menguraikannya. Terima kasih telah memposting ini sehingga saya bisa mengetahui kesalahan saya sendiri.
Nicholas Decker
Masalah OP benar-benar berbeda. Dalam kasus Anda, Anda mencoba mem-parsing HTML sebagai JSON, dan dalam kasus OP, ia mencoba mem-parsing JSON sebagai JavaScript.
Michał Perłakowski
7

Saat Anda meminta file JSON Anda, server mengembalikan Content-Typeheader JavaScript ( text/javascript) alih-alih JSON ( application/json).

Menurut MooTools docs :

Respons dengan tipe konten javascript akan dievaluasi secara otomatis.

Hasilnya, MooTools mencoba untuk mengevaluasi JSON Anda sebagai JavaScript, dan ketika Anda mencoba untuk mengevaluasi JSON tersebut:

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

sebagai JavaScript, parser memperlakukan {dan }sebagai ruang lingkup blok alih-alih notasi objek. Itu sama dengan mengevaluasi "kode" berikut:

"votes":47,"totalvotes":90

Seperti yang Anda lihat, :sama sekali tidak terduga di sana.

Solusinya adalah mengatur Content-Typeheader yang benar untuk file JSON. Jika Anda menyimpannya dengan .jsonekstensi, server Anda harus melakukannya sendiri.

Michał Perłakowski
sumber
4

Sepertinya respons Anda sedang dievaluasi entah bagaimana. Ini memberikan kesalahan yang sama di Chrome:

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

Ini disebabkan oleh kurung kurawal '{...}' yang ditafsirkan oleh javascript sebagai blok kode dan bukan objek literal seperti yang diharapkan.

Saya akan melihat fungsi JSON.decode () dan melihat apakah ada eval di sana.

Masalah serupa di sini: Eval () = Token tak terduga: kesalahan

Zectbumo
sumber
2

Jika tidak ada yang masuk akal, kesalahan ini juga dapat disebabkan oleh Kesalahan PHP yang tertanam di dalam html / javascript, seperti yang di bawah ini

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

Bukan <br />dll dalam kode yang dimasukkan ke dalam html oleh PHP yang menyebabkan kesalahan . Untuk memperbaiki kesalahan semacam ini (suppress warning), gunakan kode ini di awal

error_reporting(E_ERROR | E_PARSE);

Untuk melihat, klik kanan pada halaman, "lihat sumber" dan kemudian periksa html lengkap untuk menemukan kesalahan ini.

Hammad Khan
sumber
1

" Uncaught SyntaxError: Unknown token " muncul kesalahan ketika data Anda mengembalikan format json yang salah, dalam beberapa kasus, Anda tidak tahu Anda mendapatkan format json yang salah.
silakan periksa dengan lansiran (); fungsi

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

pesan Anda yang diterima harus: {"firstName": "John", "lastName": "Doe"}
dan kemudian Anda dapat menggunakan kode di bawah ini

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

tanpa kesalahan " Uncaught SyntaxError: Token tak terduga "
tetapi jika Anda salah format json
mis:

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

atau

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

sehingga Anda mendapatkan format json yang salah, silakan perbaiki sebelum Anda JSON.decode atau JSON.parse

Serip88
sumber
3
Saya sarankan menggunakan console.log()daripada alert()untuk debugging.
Michał Perłakowski
1

Ini terjadi pada saya hari ini juga. Saya menggunakan EF dan mengembalikan Entitas sebagai respons terhadap panggilan AJAX. Properti virtual pada entitas saya menyebabkan kesalahan ketergantungan siklus yang tidak terdeteksi di server. Dengan menambahkan atribut [ScriptIgnore] pada properti virtual, masalahnya telah diperbaiki.

Daripada menggunakan atribut ScriptIgnore, mungkin lebih baik mengembalikan DTO saja.

Daryl
sumber
1

Ini terjadi karena saya memiliki pengaturan aturan di server ekspres saya untuk merutekan 404 kembali ke /#ditambah apa pun permintaan asli itu. Mengizinkan router sudut / js untuk menangani permintaan. Jika tidak ada rute js untuk menangani jalur itu, permintaan /#/whateverdibuat ke server, yang hanya merupakan permintaan untuk /, seluruh halaman web.

Jadi misalnya jika saya ingin membuat permintaan /correct/somejsfile.jstapi saya salah ketik untuk itu /wrong/somejsfile.jspermintaan dibuat ke server. Lokasi / file itu tidak ada, sehingga server merespons dengan 302 location: /#/wrong/somejsfile.js. Browser dengan senang hati mengikuti pengalihan dan seluruh halaman web dikembalikan. Browser mem-parsing halaman sebagai js dan Anda dapatkan

Uncaught SyntaxError: Token yang tidak terduga <

Jadi untuk membantu menemukan jalur / permintaan yang menyinggung, cari 302 permintaan.

Semoga itu bisa membantu seseorang.

Jerinaw
sumber
1

Saya memiliki masalah yang sama dan ternyata Json kembali dari server tidak valid Json-P. Jika Anda tidak menggunakan panggilan sebagai panggilan lintas domain, gunakan Json biasa.

jakob
sumber
OP menggunakan JSON, bukan JSONP.
Michał Perłakowski
0

Saya mendapat " SyntaxError: Unexpected token I" ketika saya jQuery.getJSON()mencoba untuk menderialisasi nilai nilai floating point Infinity, yang dikodekan sebagai INF, yang ilegal di JSON.

Mark Cidade
sumber
1
Pertanyaan ini tentang "Token yang tidak terduga : ".
Michał Perłakowski
0

Dalam kasus saya, saya mengalami kesalahan yang sama, saat menjalankan aplikasi musim semi mvc karena pemetaan yang salah pada kontroler mvc saya

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

saya mengubah pemetaan di atas menjadi

 @RequestMapping("/private/updatestatus")

atau

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)
Shravan Ramamurthy
sumber
0

Bagi saya bola lampu menyala ketika saya melihat sumber ke halaman di dalam browser Chrome. Saya memiliki braket tambahan dalam pernyataan if. Anda akan segera melihat lingkaran merah dengan tanda silang di garis yang gagal. Ini adalah pesan kesalahan yang agak tidak membantu, karena Kesalahan Sintaks Uncaught: Token yang tidak terduga tidak merujuk ke nomor baris saat pertama kali muncul di konsol Chrome.

JGFMK
sumber
0

Saya melakukan kesalahan dalam hal ini

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

Sudah saya intialized fsvariabel. Tapi sekali lagi saya taruh vardi baris kedua. Yang ini juga memberikan kesalahan semacam itu ...

Jana
sumber
0

Bagi mereka yang mengalami ini di AngularJs 1.4.6 atau yang serupa, masalah saya adalah dengan angular tidak menemukan template saya karena file di templateUrl(path) yang saya berikan tidak dapat ditemukan. Saya hanya harus menyediakan jalan yang bisa dijangkau dan masalahnya hilang.

lwdthe1
sumber
saya memecahkan masalah yang sama dengan memperbaiki url baseref - menunjuk ke root folder => <base href = "/">
Abdeali Chandanwala
0

Dalam kasus saya itu adalah url yang salah (tidak ada), jadi mungkin 'kirim' Anda di baris kedua harus yang lain ...

Michal - wereda-net
sumber
0

Kesalahan saya adalah lupa kutip tunggal / ganda di sekitar url di javascript:

jadi salah kode adalah:

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

dan kode yang benar :

window.location = "https://google.com";
Saeed Arianmanesh
sumber
-2

Uncaught SyntaxError: Token yang tidak terduga}

Chrome memberi saya kesalahan untuk kode sampel ini:

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

dan menyelesaikannya memperbaiki onclick menjadi seperti

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

Tapi kesalahannya tidak ada hubungannya dengan masalah ..

ungalcrys
sumber
OP bertanya tentang "Token yang tidak terduga : ".
Michał Perłakowski