2014-06-19 24 views
8

Ho creato un'API minimalista su nodejs che restituiscono i dati in formato JSON.Il token di token imprevisto JSON dopo jQuery.ajax # get

Ma ogni volta che provo a fare una chiamata ajax # e passare la mia API come URL, ricevo un errore e giudicando da Chrome, sto ricevendo un errore "Unexpected token :";

qui il codice del server in nodejs + esprimono:

var 
http = require('http'), 
express = require('express'), 
app  = express(), 
server = http.createServer(app); 

app.get('/', function(req, res) { 
    console.log('req received'); 
     res.setHeader('Content-Type', 'application/json'); 
    res.end(JSON.stringify({ 
    Name : "Tom", 
    Description : "Hello it's me!" 
    })); 

}); 

server.listen(3000, function() { 
    console.log('Listening on 3000'); 
}); 

Il JSON restituito da "/" è: {"Name":"Tom","Description":"Hello it's me!"}.

Ecco la mia chiamata dai js client:

$.ajax({ 
    url: findUrl, 
    type: 'get', 
    dataType: 'jsonp', 
    success: function (data) { 
     self.name(data.Name); 
     self.description(data.Description); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     alert(errorThrown); 
    } 
}); 

Nel tracciare l'errore che ottengo: "jQuery111108398571682628244_1403193212453 was not called"

qualcuno può aiutarmi?

So che questa domanda è stata già posta ma non riesco a trovare una soluzione che risolva il mio programma.

+0

Controlla il tuo 'dataType '- [$ .ajax()] (http://api.jquery.com/jquery.ajax/) – Andreas

+0

@Andreas: Immagino che tu ti riferisca a" jsonp ", l'ho cambiato in" json ". Ora sto ottenendo "XMLHttpRequest non può caricare http: // localhost: 3000 /. Nessuna intestazione 'Access-Control-Allow-Origin' è presente sulla risorsa richiesta. L'origine 'null' non è quindi consentita l'accesso." come posso risolvere questo? –

risposta

9

Per supportare JSONP requests, il server dovrà includere il P, o "Imbottitura," nella risposta.

jQuery111108398571682628244_1403193212453({"Name":"Tom","Description":"Hello it's me!"}) 

L'errore di sintassi, "Unexpected token :", è perché JSONP viene analizzato come JavaScript, dove {...} rappresenta anche blocks. Approfitta della sintassi simile di JSON e JavaScript per definire i dati passati a una chiamata di funzione globale.

Per impostazione predefinita, jQuery includerà un parametro di callback query stringa con il nome della funzione:

var callback = req.query.callback; 
var data = JSON.stringify({ 
    Name : "Tom", 
    Description : "Hello it's me!" 
}); 

if (callback) { 
    res.setHeader('Content-Type', 'text/javascript'); 
    res.end(callback + '(' + data + ')'); 
} else { 
    res.setHeader('Content-Type', 'application/json'); 
    res.end(data); 
} 

ExpressJS include anche res.jsonp() che implementa già questa condizione:

app.get('/', function(req, res) { 
    console.log('req received'); 

    res.jsonp({ 
     Name : "Tom", 
     Description : "Hello it's me!" 
    }); 
}); 
-3

che si desidera utilizzare dataType: "json" invece di "jsonp"

+0

ci sono diversi motivi per cui vuoi usare jsonp, un esempio è poter chiamare su domini diversi –

+0

d'accordo, jsonp è per CORS, non puoi usare json se hai bisogno di fare una richiesta asincrona di un dominio attraverso javascript . – Karl

+1

JSONP non è per CORS. JSONP è l'hack che abbiamo usato prima che CORS fosse sviluppato e supportato dai browser. – Quentin

Problemi correlati