← Назад к курсу

Пособие по Node.js

Это подробное пособие по Node.js — от основ до практических примеров. Оно подойдёт как новичкам, так и тем, кто хочет систематизировать знания.

1. Введение в Node.js

Node.js — это среда выполнения JavaScript на сервере, построенная на движке V8 от Google. Она позволяет писать бэкенд-приложения на JavaScript, используя асинхронную, событийно-ориентированную модель.

Где применяется:

  • REST API и веб-серверы
  • Чат-приложения, онлайн-игры (WebSockets)
  • Инструменты командной строки (CLI)
  • Парсинг, обработка файлов, потоки данных

Ключевые особенности:

  • Один поток (event loop) — высокая производительность при I/O операциях
  • Асинхронность из коробки
  • Огромная экосистема пакетов (npm)

2. Установка и настройка

Установка Node.js

Скачайте LTS-версию с официального сайта или используйте менеджеры:

  • Windows/macOS — установщик .msi/.pkg
  • Linux (Ubuntu/Debian):
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
    sudo apt install -y nodejs
    

Проверка

node -v      # v20.x.x
npm -v       # 10.x.x

Первая программа (app.js)

console.log("Привет, Node.js!");

Запуск: node app.js


3. Модульная система

Node.js поддерживает CommonJS (по умолчанию) и ES модули (с настройками).

CommonJS

math.js

function add(a, b) { return a + b; }
module.exports = { add };

app.js

const { add } = require('./math');
console.log(add(2, 3)); // 5

ES модули (современный подход)

  1. Установите в package.json: "type": "module"
  2. Используйте import/export:

math.js

export function add(a, b) { return a + b; }

app.js

import { add } from './math.js';
console.log(add(2, 3));

Запуск: node app.js


4. Встроенные модули

4.1. Работа с файлами (fs)

import fs from 'fs/promises'; // промис-версия (рекомендуется)

// Чтение файла
const data = await fs.readFile('file.txt', 'utf8');
console.log(data);

// Запись
await fs.writeFile('output.txt', 'Новый текст');

// Создание папки
await fs.mkdir('my-folder', { recursive: true });

Синхронные версии: readFileSync, writeFileSync — избегайте в основном потоке.

4.2. HTTP-сервер

import http from 'http';

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
});

server.listen(3000, () => {
  console.log('Сервер запущен на http://localhost:3000');
});

4.3. Пути и файловая система (path)

import path from 'path';
const fullPath = path.join('/users', 'john', 'docs', 'file.txt');
console.log(fullPath); // /users/john/docs/file.txt
console.log(path.extname('image.jpg')); // .jpg

4.4. Работа с событиями (events)

import EventEmitter from 'events';
const emitter = new EventEmitter();

emitter.on('greet', (name) => {
  console.log(`Привет, ${name}!`);
});

emitter.emit('greet', 'Алексей');

5. Асинхронность в Node.js

В Node.js I/O операции не блокируют поток. Основные инструменты:

Колбэки (устаревают, но встречаются)

import fs from 'fs';
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

Промисы

import fs from 'fs/promises';
fs.readFile('file.txt', 'utf8')
  .then(data => console.log(data))
  .catch(err => console.error(err));

Async/await (предпочтительно)

import fs from 'fs/promises';

async function readFileAsync() {
  try {
    const data = await fs.readFile('file.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}
readFileAsync();

Важно: В верхнем уровне модулей можно использовать await (с ES модулями).


6. Менеджер пакетов NPM

Инициализация проекта

npm init -y   # создаёт package.json

Установка пакетов

npm install express      # локально (в node_modules)
npm install -g nodemon   # глобально (CLI)

Зависимости

  • dependencies — для работы приложения
  • devDependencies — для разработки (тесты, сборщики)

Скрипты в package.json

"scripts": {
  "start": "node app.js",
  "dev": "nodemon app.js"
}

Запуск: npm run dev

Популярные пакеты:

  • express — веб-фреймворк
  • nodemon — авто-перезапуск при изменениях
  • dotenv — переменные окружения
  • mongoose / pg — работа с MongoDB / PostgreSQL
  • axios — HTTP-запросы

7. Создаём простой веб-сервер на Express

Установка: npm install express

import express from 'express';
const app = express();
const PORT = process.env.PORT || 3000;

// Middleware для парсинга JSON
app.use(express.json());

// Маршруты
app.get('/', (req, res) => {
  res.send('Главная страница');
});

app.get('/users/:id', (req, res) => {
  const userId = req.params.id;
  res.json({ userId, name: 'Анна' });
});

app.post('/data', (req, res) => {
  console.log(req.body);
  res.status(201).send('Данные получены');
});

app.listen(PORT, () => {
  console.log(`Сервер запущен на порту ${PORT}`);
});

Запуск: node app.js или npm run dev (через nodemon)


8. Работа с переменными окружения

Установите dotenv: npm install dotenv

Создайте файл .env:

PORT=4000
DB_PASSWORD=secret

В коде:

import dotenv from 'dotenv';
dotenv.config();

const port = process.env.PORT || 3000;
console.log(`Порт: ${port}`);

Важно: .env добавьте в .gitignore, чтобы не раскрывать секреты.


9. Потоки (Streams) для обработки больших данных

Потоки позволяют читать/писать данные по частям, не загружая всё в память.

import fs from 'fs';

// Читающий поток
const readStream = fs.createReadStream('bigfile.txt', 'utf8');
readStream.on('data', (chunk) => {
  console.log(`Получено ${chunk.length} байт`);
});

// Записывающий поток
const writeStream = fs.createWriteStream('output.txt');
writeStream.write('Hello\n');
writeStream.end();

Используйте pipe для пересылки данных:

readStream.pipe(writeStream);

10. Работа с базами данных (пример MongoDB + Mongoose)

Установка: npm install mongoose

import mongoose from 'mongoose';
import dotenv from 'dotenv';
dotenv.config();

// Подключение
await mongoose.connect(process.env.DB_URI);
console.log('MongoDB подключена');

// Схема и модель
const userSchema = new mongoose.Schema({
  name: String,
  age: Number,
});
const User = mongoose.model('User', userSchema);

// Создание документа
const newUser = new User({ name: 'Олег', age: 30 });
await newUser.save();

// Поиск
const users = await User.find({ age: { $gte: 18 } });
console.log(users);

Для PostgreSQL используйте pg, для MySQL — mysql2.


11. Отладка и профилирование

11.1. Встроенный отладчик

node inspect app.js

Затем используйте команды: c (continue), repl, n (next).

11.2. VS Code

Создайте конфигурацию .vscode/launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/app.js"
    }
  ]
}

Ставьте точки останова и нажимайте F5.

11.3. Логирование

console.log('Обычное сообщение');
console.error('Ошибка');
console.table([{ a: 1, b: 2 }]);

Для серьёзных проектов используйте winston или pino.


12. Развёртывание приложения

12.1. Подготовка

  • Установите зависимости без dev: npm ci --only=production
  • Установите переменные окружения на сервере
  • Используйте process.env.PORT

12.2. Хостинг

  • VPS (например, DigitalOcean, Hetzner) — настройте PM2 для демонизации:
    npm install -g pm2
    pm2 start app.js --name my-app
    pm2 save
    pm2 startup
    
  • PaaS: Railway, Render, Heroku (там просто пуш в Git)

12.3. Nginx как reverse proxy (пример конфига):

server {
    listen 80;
    server_name mydomain.com;
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
    }
}

13. Практические советы

  • Избегайте блокировки event loop — не делайте синхронные тяжёлые вычисления. Выносите их в отдельные потоки (worker_threads) или разбивайте на микро-задачи (setImmediate).
  • Всегда обрабатывайте ошибки в промисах и колбэках.
  • Используйте nodemon или node --watch (встроен в Node.js 18+) для разработки.
  • Храните секреты только в .env, никогда не закоммичивайте.
  • Ставьте лимиты на размер тела запроса в Express (express.json({ limit: '10mb' })).

14. Пример итогового приложения (REST API)

package.json (основные поля)

{
  "type": "module",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  },
  "dependencies": {
    "express": "^4.18",
    "dotenv": "^16.0"
  }
}

server.js

import express from 'express';
import dotenv from 'dotenv';
dotenv.config();

const app = express();
app.use(express.json());

let items = [{ id: 1, name: 'Задача 1' }];

app.get('/items', (req, res) => res.json(items));

app.post('/items', (req, res) => {
  const newItem = { id: items.length + 1, name: req.body.name };
  items.push(newItem);
  res.status(201).json(newItem);
});

app.delete('/items/:id', (req, res) => {
  const id = parseInt(req.params.id);
  items = items.filter(item => item.id !== id);
  res.status(204).send();
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`API работает на порту ${PORT}`));

15. Заключение

Node.js — мощный инструмент для создания быстрых и масштабируемых серверных приложений на JavaScript. Освоив модули, асинхронность, работу с файлами и базами данных, вы сможете строить полноценные бэкенд-системы.

Что учить дальше:

  • TypeScript + Node.js
  • Фреймворки: Fastify, NestJS
  • WebSockets (Socket.io)
  • GraphQL (Apollo Server)
  • Тестирование (Jest, Mocha)
  • Контейнеризация (Docker)

Удачи в изучении! 🚀


Это пособие охватывает около 80% повседневных задач Node.js-разработчика. Для глубокого изучения обращайтесь к официальной документации nodejs.org.