Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Express.jsВсе вопросы
Express.jsMiddleКодинг

Как обрабатывать ошибки async/await в обработчиках маршрутов Express?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

В Express 4 async-хэндлеры не ловят ошибки автоматически — нужно либо явный try/catch с next(err), либо обёртка asyncHandler; Express 5 поддерживает async нативно.

1. Явный try/catch с передачей в next

import express, { Request, Response, NextFunction } from 'express';

const router = express.Router();

router.get('/users/:id', async (req: Request, res: Response, next: NextFunction) => {
  try {
    const user = await db.query('SELECT * FROM users WHERE id = $1', [req.params.id]);
    if (!user.rows.length) {
      return res.status(404).json({ error: 'User not found' });
    }
    res.json(user.rows[0]);
  } catch (err) {
    next(err); // передаём в error middleware
  }
});

Это самый явный способ — понятно, что происходит, и нет магии. Минус: много шаблонного кода при большом числе маршрутов.

Обработка ошибок async/await в маршрутах Express

Express 4 не умеет перехватывать ошибки из async-функций автоматически — необработанный rejected Promise просто зависнет или упадёт с UnhandledPromiseRejection. Есть три рабочих подхода.

2. Обёртка asyncHandler

Создаём утилиту, которая оборачивает async-хэндлер и автоматически пробрасывает ошибки в next:

// utils/asyncHandler.ts
import { Request, Response, NextFunction, RequestHandler } from 'express';

type AsyncFn = (req: Request, res: Response, next: NextFunction) => Promise<unknown>;

export const asyncHandler = (fn: AsyncFn): RequestHandler =>
  (req, res, next) => {
    Promise.resolve(fn(req, res, next)).catch(next);
  };
// routes/users.ts
import { asyncHandler } from '../utils/asyncHandler';

router.get('/users/:id', asyncHandler(async (req, res) => {
  const user = await userService.findById(req.params.id);
  res.json(user);
}));

Такой же паттерн предоставляет популярный пакет express-async-errors — он патчит сам Express и делает это глобально.

3. Express 5 (нативная поддержка)

В Express 5 (npm install express@^5) async-хэндлеры поддерживаются из коробки: отклонённый Promise автоматически вызывает next(err) без каких-либо обёрток.

// Express 5 — работает нативно
app.get('/items', async (req, res) => {
  const items = await itemService.getAll(); // если бросит — Express сам поймает
  res.json(items);
});

Error middleware (обязателен в любом случае)

// app.ts — регистрируется последним, ПОСЛЕ всех маршрутов
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
  console.error(err.stack);
  const status = (err as any).status ?? 500;
  res.status(status).json({
    error: process.env.NODE_ENV === 'production' ? 'Internal server error' : err.message,
  });
});

Подводные камни

  • Забыть вызвать next(err) — без него Express продолжит выполнение или зависнет с таймаутом.
  • Express 4 не ловит async без обёртки — UnhandledPromiseRejection в Node.js приводит к падению процесса (или ignoring в старых версиях Node).
  • Error middleware без 4 аргументов не работает — Express определяет error middleware строго по сигнатуре (err, req, res, next); если убрать next, он перестаёт быть error middleware.
  • Регистрация error middleware до маршрутов — она должна быть последней в цепочке app.use(), иначе ошибки до неё не дойдут.
  • Утечка стека в production — никогда не отправляйте err.stack клиенту; фильтруйте по NODE_ENV.
  • Повторный вызов res.json() после next(err) — если в catch вызвать и res.json(), и next(err), будет «Cannot set headers after they are sent».
  • Ошибки внутри setTimeout/setInterval не перехватываются — async/await здесь не поможет; используйте отдельный try/catch или worker threads.

Частые вопросы на собеседовании

  • В чём разница между app.use() и app.get() / app.post()?
  • Какова роль next() в middleware Express? Что происходит, если его не вызвать?
  • Как работает маршрутизация в Express? Как организовать маршруты с помощью express.Router()?
  • Что такое middleware в Express.js? Объясните цикл запрос-ответ (request-response cycle).

Типичные ошибки

  • Дает общий ответ про Node.js и не называет конкретные API Express.js.
  • Не объясняет, где в lifecycle находится ошибки async/await в route handlers.
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

Что проверяет интервьюер

  • Может объяснить ошибки async/await в route handlers на примере кода.
  • Называет ключевые API: async (req, res), next(err).
  • Использует точные API Express.js, а не вымышленные hooks/decorators/methods.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

Как вы знаете этот вопрос?

Проверить себя по теме Express.js →

Источники

  • https://expressjs.com/en/guide/error-handling.html
←Предыдущий вопросКак подключить Express к базе данных (PostgreSQL, MongoDB)?Следующий вопрос→В чём разница между синхронной и асинхронной обработкой ошибок в Express?

Связанные темы

Express.jserror-handlingrequest-lifecycle

Вакансии с этим навыком

  • Fullstack JavaScript разработчик