2011-09-20 11 views
13

Podczas tworzenia żądania POST z poprawnym JSON, bodyCarser prawidłowo analizuje treść żądania POST. Jednakże, jeśli mogę przesłać nieprawidłowy ciąg JSON jako ciała, otrzymuję błąd:Złapanie nielegalnych danych JSON POST w Expressie?

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

Więc wydaje się, że parser ciało zawodzi podczas parsowania ciała. Chciałbym jednak uchwycić to niepowodzenie i zwrócić błąd. Nie jestem pewien, co mogę zrobić, aby go złapać, więc każda pomoc będzie doceniona. Dzięki.

Odpowiedz

2

To jest w connect.js bodyParser middleware. Wykonuje polecenie try/catch, a następnie wywołuje next (err). Powinieneś być w stanie złapać ten błąd i obsłużyć dodatkowy niestandardowy kod przy użyciu haka oddzwaniania app.error(). http://expressjs.com/guide.html#error-handling

+0

Hej Peter, dzięki za odpowiedź. Niestety, próbowałem tego bezskutecznie. Wygląda na to, że app.error nigdy nie jest wykonywany. Próbowałem: 'app.error (function (err, req, res, next) {console.log (" ERR ");});', ale nie jest wykonywane. Dla mojego app.configure do programowania, mam to ustawione jako 'app.use (express.errorHandler ({dumpExceptions: true, showStack: true}));'. Używam węzła 0.4.9, łączę 1.7.1 i wyrażam 2.4.6. Jakieś pomysły? Dzięki jeszcze raz. – naivedeveloper

+0

Spróbuj skomentować komunikat express errorandandera i po prostu wywołaj wywołanie app.error po skonfigurowaniu tras aplikacji. Ale poza tym nie jestem pewien, dlaczego 'app.error' nie zostanie wywołany. –

+0

Z jakiegoś powodu przy korzystaniu z funkcji express/connect JSON.parse nie generuje wyjątków, dlatego obsługa błędów nie uruchamia się. Zbadam sposób obejścia tego. – timoxley

1

Z jakiegoś powodu przy korzystaniu z funkcji Express/Connect JSON.parse nie generuje wyjątków, dlatego też obsługa błędów nie uruchamia się.

mam logged an issue with express aby dowiedzieć się, co się dzieje, ale w międzyczasie można korzystać z tego rozwiązania:

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

zmiana: ten problem nie jest znany autor wyraźnej, więc zastanawiam się, czy to inna biblioteka, która go spowodowała. Będę musiał rozebrać mój kawałek po kawałku, aby dowiedzieć się, gdzie to zachowanie jest wprowadzane.

+0

Widzę, że problem nie jest związany z ekspresowym. Dziwne. Czy byłeś w stanie wyizolować kod błędu w swojej sprawie? – naivedeveloper

+0

Nie. Nadal nie mam pojęcia – timoxley

1

spróbować umieścić swoje

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

rozwiązać to dla mnie.

Możesz także dostosować następujący kod do zarządzania Błąd

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 musi być powyżej app.use (app.router), to nie ma znaczenia względnego położenia błędu obsługi jako Perki