AI
prepair.app
Пройти интервью →
EnglishРусскийУкраїнська
🟢

Middle Node.js Backendвопросы на собеседовании Node.js

Middle · 2–4 года опыта

Собеседование Node.js крутится вокруг event loop, асинхронных паттернов, Express или NestJS и последствий однопоточного рантайма. Ниже — самые частые вопросы с эталонными ответами. Middle: более глубокое понимание, оптимизацию и реальные рабочие ситуации.

Темы для подготовки

Event loop и его фазы
Промисы и async/await
Streams и buffers
Express / NestJS
Middleware и обработка ошибок
JWT и аутентификация

8 вопросов уровня Middle с ответами

1

В чём разница между process.nextTick() и setImmediate()?

Ответ

process.nextTick ставит колбэк в очередь до перехода event loop к следующей фазе, вперёд микрозадач промисов. setImmediate планирует колбэк на фазу check следующей итерации. Поэтому nextTick всегда срабатывает раньше, а рекурсивные вызовы nextTick могут полностью заморить event loop — из-за чего setImmediate безопаснее как дефолт для откладывания работы.

2

Что такое Promise? Объясните разницу между Promise.all и Promise.allSettled.

Ответ

Promise представляет значение, которое появится позже, и находится в состоянии pending, fulfilled или rejected. Promise.all резолвится, когда завершились все входные промисы, но реджектится сразу на первом отказе, отбрасывая остальные результаты — это подходит, когда для продолжения нужны все. Promise.allSettled всегда резолвится, отдавая статус и значение по каждому элементу, что годится для независимых операций, где одна ошибка не должна отменять остальные.

3

Как обрабатывать ошибки в async/await? Что произойдёт при unhandled rejection?

Ответ

Ожидаемые вызовы оборачивают в try/catch либо вешают .catch на возвращённый промис. В Express ошибка, брошенная внутри async-обработчика, не перехватывается фреймворком, если её не передать в next(), поэтому обычно используют обёртку или express-async-errors. Необработанный реджект в современных версиях Node по умолчанию завершает процесс, и это осознанное поведение — состояние процесса неизвестно, его нужно перезапустить.

4

Что такое streams и когда их использовать вместо чтения файла целиком?

Ответ

Streams обрабатывают данные порциями, поэтому расход памяти не зависит от размера полезной нагрузки, а первый байт можно отдать до того, как прочитан последний. Чтение двухгигабайтного файла в Buffer съедает память и задерживает ответ; при использовании pipe тот же файл течёт прямо клиенту. Ещё streams композируются через pipe или pipeline, позволяя выстроить цепочку распаковки, преобразования и вывода с автоматической обработкой backpressure.

5

Что такое middleware в Express? Как работает next()?

Ответ

Middleware — это функция, принимающая запрос, ответ и next, которая выполняется в порядке регистрации и образует конвейер. Вызов next() передаёт управление следующему middleware; если его не вызвать и не отправить ответ, запрос повиснет. Передача аргумента в next() перепрыгивает к обработчику ошибок, который распознаётся по наличию четырёх параметров.

6

Как Node обрабатывает CPU-интенсивные задачи? Что такое worker threads?

Ответ

Так как JavaScript выполняется в одном потоке, тяжёлое вычисление блокирует все ожидающие запросы. Worker threads выполняют JavaScript в параллельных потоках внутри того же процесса, обмениваясь сообщениями и разделяемыми буферами, что подходит для хеширования, обработки изображений или парсинга. Альтернативы — вынести работу в отдельный сервис или очередь задач; кластеризация лишь добавляет процессы и не ускоряет один запрос.

7

Что такое JWT? Где его хранить и какие есть риски?

Ответ

JWT — это подписанный токен с набором утверждений, позволяющий серверу аутентифицировать запрос без похода за сессией. Хранение в localStorage делает его уязвимым к XSS; хранение в куке с httpOnly, Secure и SameSite закрывает XSS, но требует защиты от CSRF. Более глубокий компромисс — отзыв: stateless-токен действителен до истечения срока, поэтому в чувствительных системах используют короткоживущие access-токены с refresh-токенами и серверным списком отозванных.

8

В чём разница между require и import? Что такое CommonJS и ESM?

Ответ

CommonJS require синхронен, разрешается в рантайме и может вызываться условно внутри функции. ESM import статичен, поднимается наверх и анализируется до выполнения, что открывает tree shaking и top-level await. Формат пакета задаётся через "type": "module" или расширения .mjs и .cjs; ESM может импортировать CommonJS, а обратное требует динамического import(), потому что require не умеет загружать асинхронный граф модулей.

🦎

Прочитать ответы недостаточно

На собеседовании ты говоришь вслух под давлением. Кем задаст эти же вопросы, оценит каждый ответ и покажет, что именно подтянуть.

Пройти интервью Middle Node.js Backend →
Бесплатно · 3 интервью в месяц

Другие уровни — Node.js Backend

Junior Node.js BackendSenior Node.js BackendВсе вопросы Node.js Backend

Другие специализации

🔍Middle QA Manual🤖Middle QA AutomationMiddle Java Backend🐍Middle Python Backend🐘Middle PHP Backend🦫Middle Go Backend⚛️Middle React Frontend💚Middle Vue Frontend🅰️Middle Angular FrontendMiddle Next.js