Поймать незаконные данные JSON POST в Express?
При создании запроса POST с действующим JSON, BodyParser корректно анализирует тело запроса POST. Тем не менее, если я отправляю недопустимую строку JSON в качестве тела, я получаю сообщение об ошибке:
SyntaxError: Unexpected token ILLEGAL
at parse (native)
at IncomingMessage.<anonymous>(/home/.../middleware/bodyParser.js:69:15)
...
Таким образом, кажется, что синтаксический анализатор тела не работает во время разбора тела. Однако я хотел бы поймать эту ошибку и вернуть ошибку. Я не знаю, что я могу сделать, чтобы поймать его, поэтому любая помощь будет оценена по достоинству. Спасибо.
Ответы
Ответ 1
Это находится в connect.js промежуточном программном обеспечении bodyParser. Он выполняет попытку/уловку, а затем вызывает следующее (err). Вы должны уловить эту ошибку и обработать дополнительный пользовательский код с помощью app.error()
callback hook. http://expressjs.com/guide.html#error-handling
Ответ 2
По какой-то причине при использовании express/connect JSON.parse не генерирует исключений, поэтому ваш обработчик ошибок не срабатывает.
Я зарегистрировал проблему с выражением, чтобы узнать, что происходит, но в то же время вы можете использовать это обходное решение:
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());
update: эта проблема не знакома автору экспресса, поэтому мне интересно, вызывает ли это другая библиотека. Придется разобрать мой код по частям, чтобы выяснить, где это поведение вводится.
Ответ 3
Попробуйте поставить
app.use(express.bodyParser());
после
app.use(express.errorHandler(...))
решил это для меня.
Вы также можете адаптировать следующий код для управления ошибкой
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'));
}
});
};
Ответ 4
bodyParser должен быть выше app.use(app.router), не имеет значения относительное местоположение для обработчика ошибок как Perki