Programming

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-сервер