Node.js
Node.js — среда выполнения JavaScript вне браузера на движке V8 с неблокирующим вводом-выводом, применяемая для серверов, API и ботов.
Что такое Node.js
Node.js — среда выполнения JavaScript вне браузера, построенная на движке V8 от Google и выпущенная в 2009 году. До неё JavaScript жил только на страницах; Node дал ему доступ к файловой системе, сети и процессам — то есть превратил в язык для серверов, скриптов и CLI-утилит.
Ключевая особенность — однопоточный цикл событий с неблокирующим вводом-выводом. Запрос к базе не останавливает поток: Node отправляет его, берёт следующее задание и возвращается к результату, когда тот придёт.
console.log("1");
setTimeout(() => console.log("3"), 0); // уходит в очередь
Promise.resolve().then(() => console.log("2"));
console.log("1.5");
// Порядок: 1, 1.5, 2, 3 — микрозадачи раньше макрозадач
Следствия практичные:
- Хорош, когда узкое место — ожидание: API-шлюзы, прокси, WebSocket, чаты, стриминг. Тысячи одновременных соединений при скромной памяти.
- Плох на счётной нагрузке. Обработка изображения или разбор гигабайтного файла займут единственный поток, и все остальные запросы встанут в очередь. Такое выносят в worker threads, отдельный сервис или очередь задач.
- Одно ядро. Один процесс Node не использует остальные ядра CPU — нужен кластер или несколько реплик за балансировщиком.
axios — что это
axios — популярная библиотека для HTTP-запросов, работающая и в Node.js, и в браузере. Промис-ориентированный API, автоматический разбор JSON, интерцепторы, таймауты.
import axios from "axios";
const { data } = await axios.get("https://api.example.com/users/1");
console.log(data.name); // JSON уже разобран
await axios.post("https://api.example.com/orders",
{ item: "gpu", qty: 1 },
{ headers: { Authorization: "Bearer TOKEN" }, timeout: 5000 }
);
С 2022 года в Node есть встроенный fetch, и axios перестал быть обязательным. Чем они отличаются:
| axios | fetch | |
|---|---|---|
| Установка | Зависимость | Встроен (Node 18+) |
| JSON | Разбирает сам | Нужен await res.json() |
| Ошибка 404/500 | Бросает исключение | Резолвится успешно, проверяйте res.ok |
| Таймаут | Опция timeout |
Через AbortSignal.timeout() |
| Интерцепторы, ретраи | Из коробки | Пишете сами |
Строка про ошибки — главная ловушка fetch: он падает только на сетевых сбоях, а HTTP-ошибку возвращает как обычный ответ. if (!res.ok) throw ... придётся писать руками. Для простых запросов берите fetch и не тащите зависимость; для клиента к внешнему API с общими заголовками, ретраями и логированием axios сэкономит время.
Telegram-бот на Node.js
Типовой сценарий. Библиотеки: grammY (современная, на TypeScript), telegraf, node-telegram-bot-api.
import { Bot } from "grammy";
const bot = new Bot(process.env.BOT_TOKEN);
bot.command("start", (ctx) => ctx.reply("Привет! Пришли ссылку."));
bot.on("message:text", async (ctx) => {
await ctx.reply(`Ты написал: ${ctx.message.text}`);
});
bot.start(); // long polling
Токен держите в переменной окружения, а не в коде: попав в Git, он утечёт, а отозвать его можно только через BotFather.
Два способа получать апдейты:
| Long polling | Webhook | |
|---|---|---|
| Как | Бот сам опрашивает Telegram | Telegram шлёт POST на ваш URL |
| Нужен белый IP и HTTPS | Нет | Да |
| Задержка | Небольшая | Минимальная |
| Когда | Разработка, боты без нагрузки | Прод, много сообщений |
Long polling работает откуда угодно, включая ноутбук за NAT. Для прода на VPS переключаются на webhook: Nginx с TLS принимает запросы и проксирует их в приложение. Подробнее — Telegram-боты.
Запуск в проде
Боту и небольшому API хватает VPS с 1 vCPU и 512 МБ–1 ГБ RAM. Процесс надо держать живым — юнитом systemd с Restart=always или через pm2; иначе первое же необработанное исключение уронит бот до вашего следующего входа на сервер. Подробнее про nvm, npm ci и сборку — Node.js-тулинг.
Связанные термины
- Node.js-тулинг — nvm, npm, сборщики и pm2
- Telegram-боты — polling против webhook подробно
- REST API — основной класс задач для Node
- WebSocket — где событийная модель Node сильнее всего
- VPS — где обычно живут боты и небольшие API
- Python — главная альтернатива для тех же задач
Готовы запустить GPU-задачу?
Запустить GPU-сервер