StudyCode
Перехватываем и нормализуем ошибки — синтаксические, валидационные, системные.
Сценарий: POST /data с телом «not a json». Handler делает JSON.parse → исключение.
app.post('/data', (req, res, next) => {
try {
const data = JSON.parse(req.body); // 💥
res.json({ ok: true, data });
} catch (err) {
next(err); // → error middleware
}
});
// error-handling middleware: 4 аргумента
app.use((err, req, res, next) => {
res.status(400).json({
ok: false, error: "Invalid JSON", code: 400
});
});{
"ok": false,
"error": "Invalid JSON",
"code": 400
}500 Internal Server Error
Error: Unexpected token 'o'...
at JSON.parse (<anonymous>)
at /app/routes/data.js:3В Node.js/Express возникают три вида ошибок:
Синтаксические — JSON.parse('bad') бросает SyntaxError.
Логические — код выполнился, но результат неверный.
Сетевые/внешние — БД недоступна, API вернул ошибку.
Для перехвата используй try/catch. Express поддерживает глобальный обработчик ошибок — функцию с четырьмя аргументами: (err, req, res, next).
// Глобальный обработчик ошибок (последний app.use)
app.use((err, req, res, next) => {
const normalized = normalizeError(err);
res.status(normalized.code).json({
ok: false,
error: normalized.message,
code: normalized.code,
});
});
// Маршрут с безопасным парсингом
app.post('/data', (req, res, next) => {
const raw = req.headers['content-type'] === 'text/plain'
? req.body.toString()
: JSON.stringify(req.body);
const result = safeParse(raw);
if (!result.ok) return next(new Error(result.error));
res.json({ received: result.data });
});