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

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

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

Junior · без опыта / до 1 годаMiddle · 2–4 года опытаSenior · 5+ лет опыта

Что спрашивают

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

10 реальных вопросов с ответами

К каждому вопросу — эталонный ответ, с которым можно сравнить свой.

1

Объясните event loop в Node.js. Какие у него фазы?

Ответ

Event loop по кругу обрабатывает очереди завершённых операций по фазам: таймеры для setTimeout и setInterval, отложенные колбэки, poll для входящего I/O, check для setImmediate и колбэки закрытия. Между каждой фазой Node вычерпывает очередь микрозадач — сначала process.nextTick, затем колбэки промисов. Именно поэтому долгая синхронная функция блокирует все запросы на сервере: пока она не вернётся, не выполнится ничего.

2

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

Ответ

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

3

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

Ответ

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

4

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

Ответ

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

5

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

Ответ

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

6

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

Ответ

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

7

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

Ответ

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

8

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

Ответ

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

9

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

Ответ

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

10

Как реализовать graceful shutdown?

Ответ

По SIGTERM перестают принимать новые соединения через server.close(), дают завершиться текущим запросам, а затем закрывают пулы БД, консьюмеров очередей и таймеры перед выходом. Таймаут принудительно завершает процесс, если что-то зависло, чтобы контейнер не застревал. Без этого деплой рвёт запросы на середине и может оставить транзакции или сообщения очереди в несогласованном состоянии.

🦎

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

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

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

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

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🦫Go Backend⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing