2016-06-02 11 views
6

Ho un backend MEAN stack dove desidero rispondere conExpress.js codice di stato di risposta con jsonp payload

return res.status(400).jsonp({ 
    message: 'Parsing failed.', 
    code: '123' 
}); 

Quando un'applicazione angolare utilizza questo endpoint JSONP e rileva questo errore particolare riceve un 400 ma senza il suo carico utile. Quando cambio lo stato su 200/300, viene eseguito correttamente, con 400/500 no.

Su altri percorsi (POST) Posso rispondere con un codice di stato 4 ** e carico utile senza problemi.

return res.status(400).send({ 
    message: 'Codes do not match.', 
    code: '234' 
}); 

Qualunque idea di cosa sto trascurando?

+0

hai configurato il callback JSONP predefinito Express in JSON_CALLBACK? – Nivesh

+1

@Nivesh correggimi se ho frainteso, ma se questo non fosse il caso, 'res.jsonp ({code: '234'})' o 'res.status (300) .jsonp ({code: '234' }) "Non funzionerebbe neanche, vero? – Tom

+1

@Nivesh se l'impostazione di callback non è corretta, fallirebbe anche per le risposte 200/300 ... – robertklep

risposta

2

Sembra che si tratti di una cosa del browser: quando viene richiesto uno script remoto (come nel caso delle richieste JSONP) e la risposta restituisce uno stato HTTP 400 (o superiore), qualsiasi codice che possa ancora essere restituito nel corpo della risposta non viene valutato (questo in realtà ha perfettamente senso).

Angular saprà solo che la risposta è stata inviata e che ha uno stato di errore, ma poiché la richiamata non è stata chiamata, non vi sono dati di payload da passare alla richiamata.

ho provato una pagina HTML standalone: ​​

<script> 
function foo(data) { alert('foo') } 
</script> 
<script src="/endpoint?callback=foo"></script> 

E il seguente gestore espresso:

app.get('/endpoint', (req, res) => { 
    return res.status(400).jsonp({ hello : 'world' }); 
}); 

Uno stato di 400 non fa scattare l'allarme, uno status 200 fa. Inoltre, non funziona se il gestore restituisce JS normale (che agisce come un semplice file .js che viene caricato con un <script src=...>).

Quindi, per le richieste JSONP, è necessario attenersi a 200 risposte e trasmettere eventuali errori in qualche altro modo (ad esempio l'impostazione di una proprietà error nell'oggetto risposta).

+0

davvero, fammi vedere anche questo: – Nivesh

+1

Grazie a Robert, per la conferma di ciò che avevo già capito: non funzionerà! :) Sembra strano, dovrebbe funzionare secondo il documenti: http://expressjs.com/en/api.html#res.jsonp. E quando si usa 'res.jsonp (400, {})' Vedo questo passaggio nei registri: 'espr cancellato res.jsonp (stato, ogg): usa res.status (stato) .jsonp (obj) invece ' – Tom

+0

@ Tom hmm si, strano che la documentazione dia questo suggerimento. Mi chiedo se abbiano mai provato _tested_ it: P – robertklep

Problemi correlati