Пособие по 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 модули (современный подход)
- Установите в package.json: "type": "module"
- Используйте 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.