Node.js Backend | YeaHub – Telegram
Node.js Backend | YeaHub
499 subscribers
165 photos
15 videos
413 links
Теория, подготовка к интервью и курсы для Node.js разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#полезное
🛞 AI-генератор бесконечных карт

Nano Banana Infinimap — экспериментальный генератор карт, использующий ИИ для создания бесшовных тайлов. Проект демонстрирует возможности модели Nano Banana, позволяя генерировать огромные карты с учетом соседних тайлов.

Основные моменты:
🔵 Бесконечные карты с навигацией на базе Leaflet
🔵 Генерация тайлов с использованием модели Google Nano Banana
🔵 Учет соседних тайлов для плавных краев
🔵 Локальное хранение данных

GitHub: https://github.com/seezatnap/nano-banana-infinimap

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😊 Чистая архитектура фронтенд-приложений

Чистая архитектура фронтенд-приложений — это подход к организации кода, чтобы приложение было простым в поддержке, тестировании и масштабировании. Его цель — разделить логику приложения на слои, чтобы изменения в одном слое минимально влияли на другие. Продолжаем делиться циклом статей, где автор дает советы по организации чистой архитектуры.
Читать статью

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
Разбор Promise

Promise — это встроенный в JavaScript объект, который описывает результат асинхронной операции. Асинхронной считается операция, которая выполняется не сразу, а через какое-то время. Чем полезен promise – узнаешь из этого видео.

👀Смотреть видео

#видео
1
#Собес #git
🤔 Как вы разрешаете конфликты в Git?

💬 Кратко:
Конфликты возникают, когда изменения из удаленного и локального репозиториев пересекаются. Чтобы разрешить конфликт, нужно вручную отредактировать проблемные файлы, выбрать правильную версию, а затем зафиксировать изменения.

📌 Полный разбор + примеры использования — на платформе:
👉
Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Please open Telegram to view this post
VIEW IN TELEGRAM
#полезное
😴 Window Mode: Погружение в 3D мир через веб-камеру

Window Mode — это демонстрация 3D-камерного контроллера, который создает иллюзию окна в виртуальный мир. С помощью отслеживания положения лица пользователя, проектируется 3D-сцена, создавая эффект присутствия. Работает с любыми 3D-видео и не требует специального оборудования.

Основные моменты:
🟠 Эмуляция окна в 3D пространстве.
🟠 Использует MediaPipe для отслеживания лица.
🟠 Поддержка форматов .vv и .splv для 3D-сцен.
🟠 Реализация на NextJS с использованием веб-воркеров.
🟠 Ожидается открытие исходников библиотек.

GitHub: https://github.com/True3DLabs/WindowMode

👉Новости 👉База вопросов
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое DLQ в микросервисах 🙃

Dead Letter Queue — это “очередь для неудачных сообщений”
Когда микросервис не может обработать сообщение после нескольких попыток, оно не удаляется и не крутится бесконечно, а попадает в DLQ

😐 Зачем это нужно
— чтобы не блокировать основную очередь
— чтобы можно было позже разобраться, почему сообщение не обработалось
— чтобы при необходимости повторно отправить сообщение вручную или автоматически

📦 Пример
Допустим, у тебя есть очередь orders, и воркер обрабатывает заказы.
Если из-за ошибки воркер несколько раз подряд не смог обработать заказ, сообщение попадёт в orders.DLQ.
Туда можно подключить отдельный обработчик или просто просматривать ошибки

Еще советую добавить Alert на метрику, когда сообщений в очереди больше одного 😇

🚀 Пост Guru Node.js: @DemetraIT
Please open Telegram to view this post
VIEW IN TELEGRAM
2
#Собес #proto #прототип
🤔 Для чего нужен прототип?

💬 Кратко:

Прототип — это объект, от которого другой объект может наследовать свойства и методы. В JavaScript каждый объект имеет скрытое свойство [[Prototype]], которое указывает на его прототип. Это позволяет организовать наследование, чтобы не дублировать код и переиспользовать общие методы. Например, если метод не найден в объекте, JavaScript ищет его в прототипе.

Пример:
const animal = { eats: true };
const dog = Object.create(animal);
console.log(dog.eats); // true


📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#Собес #git_push #git_pull
🤔 Что делают команды git push и git pull?

💬 Кратко:

Команда git push отправляет ваши локальные изменения в удаленный репозиторий. Команда git pull скачивает изменения из удаленного репозитория и объединяет их с вашей локальной версией.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #nan #number #isnan
🤔 Что такое NaN? Какого типа это значение? Как можно узнать, равно ли значение переменной NaN?

💬 Кратко:

NaN (Not-a-Number) — это специальное значение, представляющее результат нечисловой операции, которая должна возвращать число. NaN является типом number, но не равен ни одному значению, даже самому себе. Чтобы проверить, является ли значение NaN, используется функция isNaN() или Number.isNaN().

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
2
🐱 DataLoader и проблема N+1

Когда ты делаешь запрос на список сущностей, а для каждой из них внутри цикла идёт ещё один запрос — поздравляю, ты поймал N+1 проблему

Например:
const users = await db.query('SELECT * FROM users');
for (const user of users) {
user.posts = await db.query('SELECT * FROM posts WHERE user_id = $1', [user.id]);
}

Результат — один запрос на юзеров и N запросов на посты. На 100 юзеров это уже 101 запрос.
Больно для БД 😱😱😱

⚙️ Решения:
1) JOIN — часто помогает, если нужно просто склеить данные
2) IN-запрос — SELECT * FROM posts WHERE user_id IN (...)
3) DataLoader — если у тебя GraphQL или сложные вложенные запросы

🧠 Как работает DataLoader
DataLoader — это умный батчер и кэшер от Facebook

Он не делает магии, а просто:
1) Копит ключи (например, userId), по которым нужно загрузить данные
2) Выполняет один общий запрос, вроде:
SELECT * FROM posts WHERE user_id IN (1,2,3,...)

3) Раскладывает результат обратно по пользователям

Почитать подробнее можно тут

🚀 Пост Guru Node.js: @DemetraIT
Please open Telegram to view this post
VIEW IN TELEGRAM
1
#Собес #сравнение #типы_данных #операторы
🤔 Как происходит сравнение типов?

💬 Кратко:

В JavaScript сравнение типов зависит от оператора. Оператор === (строгое равенство) требует, чтобы типы сравниваемых значений были одинаковыми. Оператор == (нестрогое равенство) автоматически приводит типы к общему значению перед сравнением. Поэтому при нестрогом сравнении, например, число и строка могут быть равны.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #sql #optimization #index
🤔 Как оптимизировать SQL-запрос, выбирающий все посты пользователей с >500 подписчиков (с джойнами и проверкой NULL)?

💬 Кратко:

- Добавить индексы на subscribers_count и user_id.
- Использовать INNER JOIN вместо LEFT JOIN, если NULL не нужны.
- Заменить подзапросы на JOIN.
- Применить покрывающий индекс.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#tool #графы
📚 Терялся в собственном коде?

Встречай Gitvizz, инструмент, который мгновенно превращает кодовую базу в интерактивные графы, чтобы наглядно увидеть, как всё связано

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #event_loop #asynchronous #nodejs
🤔 Что такое process.nextTick()

💬 Кратко:

process.nextTick() — это метод, который ставит колбэк в специальную очередь. Эта очередь обрабатывается сразу после завершения текущей операции, но до перехода к следующей фазе Event Loop. Это позволяет отложить выполнение кода, но гарантировать, что он выполнится как можно скорее, даже раньше установленных таймеров.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
2
😐 Уровни изоляции транзакций и аномалии

Когда несколько транзакций работают одновременно, они могут мешать друг другу и создавать странные эффекты — аномалии.
Чтобы держать порядок, базы данных вводят уровни изоляции — насколько сильно транзакции изолированы друг от друга.



⚠️ Типичные аномалии

— Dirty Read (грязное чтение) — читаешь данные, которые ещё не закоммичены.
Если транзакция откатится — ты прочитал “призрак”.

— Non-repeatable Read (неповторяемое чтение) — читаешь одну и ту же строку дважды, а результат разный, потому что другая транзакция изменила её между запросами.

— Phantom Read (фантомное чтение) — при повторном запросе появляются новые строки, подходящие под условие, которых раньше не было.



🔒 Уровни изоляции
1) READ UNCOMMITTED — можно читать даже незакоммиченные данные. Самый быстрый и самый опасный.

2) READ COMMITTED — читаешь только закоммиченные данные.
Нет грязных чтений, но возможны неповторяемые и фантомные.
(По умолчанию в PostgreSQL)

3) REPEATABLE READ — при повторном чтении данные не меняются.
Нет грязных и неповторяемых чтений, но фантомы возможны.

4) SERIALIZABLE — максимальная изоляция, всё выглядит как последовательное выполнение. Полностью без аномалий, но возможны откаты при конфликтах

💡 Чем выше уровень изоляции — тем меньше аномалий, но ниже производительность

🚀 Пост Guru Node.js: @DemetraIT
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥2🐳1
#Собес #замыкание #функции
🤔 Что такое замыкания в JavaScript и почему они важны?

💬 Кратко:

Замыкание — это функция, которая "запоминает" свою область видимости даже после того, как внешняя функция, в которой она была объявлена, завершила выполнение. Замыкания позволяют создавать функции с доступом к переменным из внешней функции, что полезно для работы с приватными данными и сохранения состояния между вызовами функции.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#tool #визуализатор
📚 Визуализатор выполнения JS-кода

Пишешь код в редакторе, двигаешь слайдер и смотришь, как движок выполняет каждую инструкцию

Перейти к материалу

👉 База вопросов 👉 Новости
🔥3
#Собес #наследование #__proto__ #прототипы
🤔 Как создать наследование в JavaScript с использованием прототипов?

💬 Кратко:

Наследование в JavaScript можно реализовать через прототипы, связывая объекты друг с другом. Это можно сделать вручную с помощью свойства __proto__ или с использованием метода Object.create(). Это позволяет новому объекту получать доступ к свойствам и методам другого объекта через цепочку прототипов.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #замыкание #функции
🤔 Что такое замыкания в JavaScript и почему они важны?

💬 Кратко:

Замыкание — это функция, которая "запоминает" свою область видимости даже после того, как внешняя функция, в которой она была объявлена, завершила выполнение. Замыкания позволяют создавать функции с доступом к переменным из внешней функции, что полезно для работы с приватными данными и сохранения состояния между вызовами функции.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
😳 Почему Query Builder лучше, чем ORM

ORM — звучит красиво: пишешь классы, аннотации, а база сама как-то живёт. Но на практике — это как ездить закрытыми глазами на машине на автопилоте

🐗 1. Query Builder делает ровно то, что ты просишь

Query Builder — это тонкая обёртка над SQL.
Ты чётко контролируешь какой запрос пойдёт в базу, какие JOIN’ы выполняются и какие поля читаются.
Он не “угадывает”, что ты хотел сделать — он просто выполняет твой запрос

С Query Builder:
await db('users')
.select('id', 'email')
.where('is_active', true);

SQL под капотом — предсказуемый:

SELECT id, email FROM users WHERE is_active = true;


А ORM может внезапно решить “загрузить” связи, добавить лишние поля или сделать 3 подзапроса вместо одного.
Ты думаешь, что сделал findOne, а реально — отправил 5 SQL-запросов

🍆 2. Работа с данными — это высокие риски

База данных — сердце системы.
Если ты не понимаешь, какой SQL реально выполняется, ты не контролируешь производительность и целостность данных

ORM часто скрывает логику за “удобным” API, но любая сложная операция превращается в дебри.
Query Builder же заставляет мыслить на уровне SQL, а не на уровне магии “entities” и “relations”


🙂 3. Меньше магии — меньше проблем

TypeORM, Sequelize, Prisma — все они в какой-то момент начинают диктовать свои правила.
Тебе нужно не просто “сделать запрос”, а ещё угадать, как ORM это интерпретирует
• Миграции — можно и нужно писать руками. Так надёжнее
• Сущности (Entity) в TypeORM — часто мешают, особенно когда структура БД не совпадает 1:1 с моделями кода
• При изменениях в схеме ORM может внезапно удалить или пересоздать таблицу, если ты где-то забыл флаг


😱 4. Иногда ORM тоже нормик

ORM удобно, пока проект маленький и нужно собрать быструю гипотезу на коленке


🚀 Пост Guru Node.js: @DemetraIT
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2