1. Вопрос: Что такое Node.js и чем он отличается от JavaScript в браузере?
Ответ: Node.js — это среда выполнения JavaScript, построенная на движке V8 от Google. Она позволяет запускать JavaScript вне браузера, на сервере. Основные отличия: отсутствие DOM и API браузера, наличие модулей для работы с файловой системой, сетью, процессами ОС, а также собственный менеджер пакетов npm.
2. Вопрос: Что такое цикл событий (event loop) в Node.js и как он работает?
Ответ: Цикл событий — это механизм, который позволяет Node.js выполнять неблокирующие операции ввода‑вывода, несмотря на то что JavaScript однопоточен. Он берёт задачи из очереди событий и передаёт их на выполнение движку V8. Операции ввода‑вывода делегируются системному ядру, что позволяет не блокировать основной поток.
3. Вопрос: В чём разница между process.nextTick() и setImmediate()?
Ответ: process.nextTick() ставит callback в начало очереди текущей фазы цикла событий — он выполнится сразу после завершения текущей операции, но перед тем, как цикл перейдёт к следующей фазе. setImmediate() помещает callback в фазу "check" цикла событий, которая наступает после фаз ввода‑вывода. Таким образом, nextTick выполняется раньше, чем setImmediate.
4. Вопрос: Какие глобальные объекты доступны в Node.js?
Ответ: Например: global, __dirname, __filename, process, Buffer, module, exports, require(). В отличие от браузера, в Node.js нет объекта window, но есть global, который является корневым.
5. Вопрос: Для чего используется модуль fs?
Ответ: Модуль fs (file system) предоставляет API для работы с файловой системой: чтение, запись, переименование, удаление файлов и директорий, получение информации о файлах. Он поддерживает как синхронные, так и асинхронные методы.
6. Вопрос: Что такое npm и какую роль он играет в экосистеме Node.js?
Ответ: npm (Node Package Manager) — это стандартный менеджер пакетов для Node.js. Он позволяет устанавливать, обновлять и удалять сторонние библиотеки, управлять зависимостями проекта через файл package.json, а также публиковать собственные пакеты.
7. Вопрос: Объясните понятие "потоки" (streams) в Node.js.
Ответ: Потоки — это абстракция для последовательного чтения или записи данных. Они позволяют обрабатывать большие объёмы информации по частям, не загружая всю память сразу. В Node.js существуют четыре типа потоков: Readable, Writable, Duplex и Transform.
8. Вопрос: Что такое middleware в контексте Express.js? Приведите пример.
Ответ: Middleware — это функции, которые имеют доступ к объектам запроса (req), ответа (res) и следующей функции в цикле обработки (next). Они могут выполнять код, изменять объекты запроса/ответа, завершать обработку или передавать управление дальше. Пример: app.use(express.json()) — парсит JSON тела запроса.
9. Вопрос: Как обрабатывать ошибки в асинхронном коде Node.js?
Ответ: Существует несколько способов: колбэки с первым аргументом-ошибкой (error-first callbacks), промисы (обработка через .catch()), использование try/catch с async/await, а также глобальный обработчик process.on('uncaughtException') и process.on('unhandledRejection').
10. Вопрос: Для чего нужен package-lock.json?
Ответ: Файл package-lock.json фиксирует точные версии всех установленных зависимостей и их вложенных модулей. Это гарантирует, что на любой машине при выполнении npm install будет получено идентичное дерево зависимостей, что устраняет неопределённость версий.
11. Вопрос: Что такое буферы (Buffer) в Node.js?
Ответ: Buffer — это глобальный класс для работы с бинарными данными напрямую в памяти. В отличие от обычных массивов, размер буфера фиксирован и предназначен для работы с потоками данных, файлами, сетевыми пакетами и другими низкоуровневыми операциями.
12. Вопрос: В чём отличие между require() и import?
Ответ: require() используется в CommonJS (стандарт Node.js по умолчанию) — он синхронный и загружает модули во время выполнения. import — это синтаксис ES-модулей (ECMAScript), поддерживаемый в Node.js с версии 12 с флагом --experimental-modules или при использовании расширения .mjs. import может быть асинхронным и анализируется на этапе парсинга.
13. Вопрос: Как создать простой HTTP-сервер на Node.js без сторонних фреймворков?
Ответ: Используя встроенный модуль http:
javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World');
});
server.listen(3000);
14. Вопрос: Что такое кластеризация (cluster) в Node.js и зачем она нужна?
Ответ: Модуль cluster позволяет создавать дочерние процессы (workers), которые разделяют один порт сервера. Это позволяет использовать все ядра процессора и обеспечивает высокую доступность — при падении одного воркера основной процесс (master) может создать новый.
15. Вопрос: Как работать с переменными окружения в Node.js?
Ответ: Переменные окружения доступны через объект process.env. Например, process.env.PORT. Для удобства часто используют файл .env и библиотеку dotenv, которая загружает переменные из файла в process.env.
16. Вопрос: Какие основные аргументы командной строки можно использовать при запуске Node.js?
Ответ: Например:
- node --version — версия Node.js;
- node --eval "code" — выполнить код;
- node --inspect — запустить с отладчиком;
- node --max-old-space-size=4096 — ограничить память;
- node -r module — предзагрузить модуль.
17. Вопрос: Что такое "EventEmitter" и где он применяется?
Ответ: EventEmitter — это класс из модуля events, который позволяет подписываться на события и генерировать их. Многие встроенные объекты Node.js (например, потоки, http-сервер) наследуют от него. Используется для реализации паттерна "наблюдатель".
18. Вопрос: Как обеспечить безопасность Express-приложения?
Ответ: Рекомендации: использовать заголовки безопасности (helmet), валидировать входные данные, экранировать вывод, ограничивать частоту запросов (express-rate-limit), предотвращать внедрение зависимостей (npm audit), работать с куками через флаги httpOnly и secure, не использовать устаревшие версии пакетов.
19. Вопрос: Чем отличается readFile от createReadStream?
Ответ: fs.readFile() читает весь файл в память и передаёт содержимое в колбэк. Для больших файлов это может вызвать проблемы с памятью. fs.createReadStream() создаёт поток, который читает файл по частям (чанкам), что эффективно для больших объёмов данных.
20. Вопрос: Какие типы ошибок бывают в Node.js и как их классифицируют?
Ответ: Можно выделить:
- Стандартные ошибки JS (SyntaxError, ReferenceError, TypeError);
- Системные ошибки (операции ОС: ENOENT, EACCES);
- Ошибки пользовательского кода (перехватываемые исключения);
- Асинхронные ошибки (необработанные reject'ы);
- Ошибки утверждений (AssertionError).
21. Вопрос: Что такое REPL в Node.js?
Ответ: REPL (Read-Eval-Print Loop) — это интерактивная среда, в которой можно вводить выражения JavaScript и немедленно видеть результат. Запускается командой node без аргументов. Полезна для быстрого тестирования кода.
22. Вопрос: Как отлаживать Node.js приложение?
Ответ: Можно использовать встроенный отладчик (запуск с флагом --inspect и подключение Chrome DevTools), консольные логи, IDE (например, VS Code) с точками останова, а также сторонние инструменты (ndb, node-inspector).
23. Вопрос: Для чего используется модуль path?
Ответ: Модуль path предоставляет утилиты для работы с путями файловой системы: нормализация, соединение частей пути (path.join), получение расширения (path.extname), имени файла (path.basename), директории (path.dirname) и другие операции, независимые от платформы.
24. Вопрос: В чём разница между exports и module.exports?
Ответ: exports — это ссылка на module.exports. По умолчанию module.exports — пустой объект. Если присвоить exports новое значение, эта ссылка разорвётся, и экспорт не сработает. Правильный способ экспортировать один объект/функцию: module.exports = .... Для добавления свойств можно использовать exports.someProp = ....
25. Вопрос: Какие ограничения у однопоточной модели Node.js и как их обходят?
Ответ: Однопоточность означает, что длительные синхронные операции (например, сложные вычисления) блокируют цикл событий. Обходные пути:
- Использование асинхронных версий методов;
- Вынос тяжёлых вычислений в отдельный процесс через child_process.fork() или воркеры (worker_threads);
- Применение кластеризации для распределения нагрузки.
Страховка на собеседовании
Знание есть, но стресс мешает?
Бесплатное сообщество для прокачки карьеры в IT
Подпишись на https://t.me/IT_Interview_Partner_Bot
Подпишись на https://t.me/LyakhovEugene