Учебник по Node.js с запускаемыми примерами
Бесплатный учебник по Node.js с примерами, которые запускаются прямо на странице: файлы, модули, event loop, серверы Express, которым вы отправляете запросы, MongoDB и JWT. Меняйте код и запускайте снова.
Начать курсНачало работы
- Что такое Node.jsNode.js это среда выполнения, которая запускает JavaScript вне браузера, на серверах и в терминале. Это не язык и не фреймворк: это V8 плюс event loop плюс API для файлов, сети и процессов.
- Node.js и JavaScriptJavaScript это язык, а Node.js это программа, которая выполняет его вне браузера. Синтаксис одинаковый, но глобальные объекты и встроенные API вокруг вашего кода разные.
- process.argvprocess.argv это массив с командной строкой, которой запустили программу: исполняемый файл node, путь к скрипту, а затем все введённые аргументы. Чтобы получить только свои аргументы, используйте process.argv.slice(2).
- process.envprocess.env это объект с переменными окружения, с которыми запущена ваша программа на Node.js. Каждое значение либо строка, либо undefined, поэтому числа и булевы значения преобразуйте сами и задавайте каждой переменной значение по умолчанию.
- Ввод пользователяВ Node.js нет функции prompt(). Чтобы задать пользователю вопрос в терминале, создайте интерфейс readline на process.stdin и вызовите question() или дождитесь ответа через await с readline/promises.
Файлы и пути
- fs.readFileФайл в Node.js читают через fs.readFile (callback), fs.readFileSync или await readFile из fs/promises. Передайте 'utf8', чтобы получить строку, и обрабатывайте ENOENT, когда файла нет.
- fs.writeFileФайл в Node.js записывают через fs.writeFile, fs.writeFileSync или await writeFile из fs/promises. Если файла нет, он создаётся, а если есть, заменяется; чтобы дописать в конец, используйте appendFile.
- fs/promisesfs/promises это версия модуля fs в Node на промисах: readFile, writeFile, readdir, stat, mkdir, rm и rename возвращают промисы, которые вы ждёте через await, а ошибки ловятся через try/catch.
- Модуль pathМодуль path собирает и разбирает пути к файлам по правилам операционной системы. path.join склеивает части пути, а path.resolve превращает их в абсолютный путь, начиная от текущей папки.
Асинхронный Node
- Event LoopEvent loop в Node.js выполняет ваши callback'и по фазам (timers, poll, check, close), а между любыми двумя callback'ами опустошает очередь process.nextTick и затем очередь промисов. Запустите примеры и посмотрите точный порядок.
- EventEmitterEventEmitter из модуля events в Node позволяет объекту сообщать об именованных событиях через emit, а другому коду реагировать на них через on или once. Слушатели выполняются синхронно, в том порядке, в котором их добавили.
HTTP и Express
- HTTP сервер`http.createServer()` принимает одну функцию, которая выполняется на каждый запрос с `req` и `res`. Из `req` вы читаете метод и URL, а в `res` задаёте статус, заголовки и тело и вызываете `res.end()`.
- Маршрутизация в ExpressМаршрут в Express это метод, путь и обработчик: `app.get('/users/:id', handler)`. Связанные маршруты группируйте в `express.Router()` и подключайте под префиксом через `app.use('/api', router)`.
- Express middlewareMiddleware в Express это функция `(req, res, next)`, которая выполняется до обработчика маршрута. Она может прочитать или изменить запрос, завершить его ответом или вызвать `next()`, чтобы передать его дальше.
- req.params, query, body`req.params` хранит именованные части пути (`/users/:id`), `req.query` строку запроса (`?sort=new`), а `req.body` разобранное тело запроса, которое остаётся `undefined`, пока вы не добавите парсер тела, например `express.json()`.
- Обработка ошибокОбработчик ошибок в Express это middleware с четырьмя аргументами, `(err, req, res, next)`, который регистрируют после маршрутов. Express 5 передаёт ему выброшенные ошибки, вызовы `next(err)` и отклонённые промисы из async-обработчиков.
- express.static`app.use(express.static(path.join(__dirname, 'public')))` отдаёт каждый файл из папки `public` по соответствующему URL: `public/style.css` отвечает на `/style.css`. Добавьте путь подключения, чтобы отдавать их под префиксом.
- CORS в ExpressОшибка CORS значит, что браузер не дал странице прочитать ответ вашего API, потому что ответ не разрешал origin этой страницы. Исправляется это на сервере: отправьте `Access-Control-Allow-Origin` и отвечайте на preflight-запросы `OPTIONS`, вручную или через пакет `cors`.
Данные и аутентификация
- MongoDBРаботайте с MongoDB из Node.js через официальный драйвер mongodb: подключитесь через MongoClient, затем добавляйте, ищите, обновляйте и удаляйте документы коллекции, всё на async/await.
- JWTJWT это подписанный токен из трёх частей в base64url, который сервер выдаёт при входе и проверяет на каждом запросе. В Node.js его подписывают и проверяют пакетом jose или jsonwebtoken и секретным ключом.