2011-09-20 10 views
13

Quando si crea una richiesta POST con JSON valido, bodyParser analizza correttamente il corpo della richiesta POST. Tuttavia, se presento una stringa JSON non valido come il corpo, ricevo l'errore:Acquisizione dati POST JSON non validi in Express?

SyntaxError: Unexpected token ILLEGAL 
at parse (native) 
at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15) 
... 

Così, sembra che il corpo sta fallendo parser durante l'analisi del corpo. Tuttavia, vorrei rilevare questo errore e restituire un errore. Non sono sicuro di cosa posso fare per prenderlo, quindi qualsiasi aiuto sarebbe apprezzato. Grazie.

risposta

2

Questo è nel connect.js bodyParser middleware. FA un try/catch e poi chiama next (err). Dovresti essere in grado di rilevare questo errore e gestirlo con un codice personalizzato aggiuntivo usando il gancio di richiamata app.error(). http://expressjs.com/guide.html#error-handling

+0

Ehi Peter, grazie per la risposta. Sfortunatamente, l'ho provato senza successo. Sembra che l'app.error non venga mai eseguita. Ho provato: 'app.error (function (err, req, res, next) {console.log (" ERR ");});', ma non viene eseguito. Per la mia app.configure per lo sviluppo, ho impostato come 'app.use (express.errorHandler ({dumpExceptions: true, showStack: true}));'. Sto usando il nodo 0.4.9, connetto 1.7.1 ed esprimo 2.4.6. Qualche idea? Grazie ancora. – naivedeveloper

+0

Prova a commentare l'express errorHandler per ora e metti semplicemente la tua chiamata ad app.error dopo che i percorsi dell'app.use sono stati configurati. Ma a parte questo non sono sicuro del motivo per cui "app.error" non viene chiamato. –

+0

Per qualche motivo, quando si utilizza express/connect, JSON.parse non genera eccezioni, motivo per cui il gestore degli errori non viene attivato. Sto indagando su questo. – timoxley

1

Per qualche motivo, quando si utilizza express/connect, JSON.parse non genera eccezioni, motivo per cui il gestore degli errori non viene attivato.

ho logged an issue with express per scoprire cosa sta succedendo, ma nel frattempo è possibile utilizzare questa soluzione alternativa:

express.bodyParser.parse['application/json'] = function(data) { 
    var result = JSON.parse(data) 
    if (typeof result != 'object') { 
    throw new Error('Problems parsing JSON') 
    } 
    return result; 
} 
app.use(express.bodyParser()); 

aggiornamento: questo problema non è familiare all'autore di esprimere, quindi mi chiedo se è un'altra libreria che lo causa. Dovrò smantellare il mio codice pezzo per pezzo per capire dove questo comportamento viene introdotto.

+0

Vedo che il problema non è correlato a espresso. Strano. Sei riuscito a isolare il codice di errore nel tuo caso? – naivedeveloper

+0

No. Non ho ancora idea – timoxley

1

tenta di mettere il vostro

app.use (express.bodyParser()); dopo app.use (express.errorHandler (...))

risolto per me.

Si può anche adattare il seguente codice per gestire l'errore

express.bodyParser.parse['application/json'] = function(req, options, fn){ 
    var buf = ''; 
    req.setEncoding('utf8'); 
    req.on('data', function(chunk){ buf += chunk }); 
    req.on('end', function(){ 
    try { 
    req.body = buf.length 
     ? JSON.parse(buf) 
     : {}; 
    fn(); 
    } catch (err){ 
    fn(new Error('Problems parsing JSON')); 
    } 
}); 
}; 
0

bodyParser deve essere al di sopra app.use (app.router), non importa posizione relativa all'errore gestore come Perki

Problemi correlati