ch
Feedback
Node.js Recipes

Node.js Recipes

前往频道在 Telegram
3 195
订阅者
无数据24 小时
-47
-230
帖子存档
Рівно рік тому вийшла книга: Al Engineering: Building Applications with Foundation Models За цей час вона не втратила актуаль
Рівно рік тому вийшла книга: Al Engineering: Building Applications with Foundation Models За цей час вона не втратила актуальності. Раджу прочитати, щоб триматися на ринку.

Декілька оновлень щодо конференції WAWTECH 🙋‍♀️🙋🙋‍♂️Організатори відкрили форму для волонтерів. Половину часу допомагаешь
Декілька оновлень щодо конференції WAWTECH 🙋‍♀️🙋🙋‍♂️Організатори відкрили форму для волонтерів. Половину часу допомагаешь з організацією, іншу половину тусуешся на конференції. Більше деталей тут Щодо моїх виступів, то їх буде два: 🎤 17-го числа я говоритиму про AI. 🎤 16-го ж проведу live-coding з генерації коду без AI. Промокод на знижку 20% для підписників: NODEJSRECIPES20

Repost from GDG Cloud Kyiv
25 days. Zero to Production-Ready AI Agents. 100% free. 🎄 Advent of Agents

Адвент-календар для розробників — це щоденний грудневий дроп корисних інсайтів і челенджів для прокачки навичок. Цього року в нас є: 🎄adventofcode.com – завдання в стилі LeetCode. Розв’язувати можна на чому завгодно - JavaScript, Python, etc 🎄tryhackme.com/adventofcyber25 – cyber security brand-new beginner-friendly challenges На жаль, цього року немає адвент-календаря від typehero.dev. Ось за Advent Of TS 2024 – adventofts.com/events/2024

Repost from DOU
⚡ Стартувало зимове зарплатне опитування DOU і рейтинг мов програмування Чекаємо всіх айтівців — тих, хто живе в Україні та з
⚡ Стартувало зимове зарплатне опитування DOU і рейтинг мов програмування Чекаємо всіх айтівців — тих, хто живе в Україні та за кордоном. І спеціалістів усіх напрямів: розробників, QA, менеджерів, DevOps, маркетологів, сапорт, сейлз, HR тощо. Гайда до анкети! На це потрібно не більше 10 хвилин: https://dou.ua/goto/HHph

Принципи роботи з таймзонами Ось набір принципів, які в мене сформувалися на практиці роботи з таймзонами: 1. Timezone, як і locale, — це частина UX, тому її обробка має виконуватися на client-side, а не на server-side. 2. Комунікація client ↔ server здійснюється виключно в UTC. Формат серіалізації — передавати значення як string чи як timestamp — визначає команда FE, але timestamp зазвичай має менший розмір і економніший у передачі. 3. Server-time завжди в UTC. Це гарантується на рівні коду ось так:
process.env.TZ = 'UTC'
4. Дані в базі зберігаються як timestamp without time zone. 5. Якщо бізнес-логіка цього потребує, server зберігає user-timezone у DB та використовує його для розрахунків. Наприклад, користувач запитує: “Покажи мої події за вчора”. 6. Усі обчислення, що залежать від timezone, виконуються на рівні запитів до бази даних. Для цього використовуємо SQL-запити з AT TIME ZONE

На співбесідах я завжди кажу щось на зразок: I’m an expert in TypeScript, Node.js, AWS, but I’m not married to this tech stac
На співбесідах я завжди кажу щось на зразок: I’m an expert in TypeScript, Node.js, AWS, but I’m not married to this tech stack and open to new approaches and tools.
Учора ця фраза з мого intro викликала у рекрутера уточнювальне запитання: “Could you tell me more about this in detail?” Відверто кажучи, тут я трохи розгубився. У мене не було заздалегідь заготовленої відповіді на таке запитання. Але мене врятувала кмітливість. За кілька годин до цього я заповнював опитувальник Auth0 (той, що на скрині). Я просто сказав: “Let me share my screen”, відкрив опитувальник і пройшовся по пунктах, показавши, з якими інструментами працював і в яких проєктах. Фактично це був стислий переказ мого CV, але з tech stack focus. Мораль дуже проста: 1) Ваше резюме, швидше за все, не читали детально. Його переглянули, але не аналізували. Тому підсвітити ключові моменти ще раз це ефективна стратегія. 2) Коли не знаєш, як краще відповісти – покажи. Це економить час, знімає ризик непорозумінь і допомагає говорити по суті.

16-17 грудня буду на конференції WAWTECH із доповіддю: “AI Driven Development for the Sane”. Розповім про здоровий глузд у ро
16-17 грудня буду на конференції WAWTECH із доповіддю: “AI Driven Development for the Sane”. Розповім про здоровий глузд у розробці та чому Vibe Coding варто навчати менеджерів, а не інженерів. Промокод на знижку 20% для підписників: NODEJSRECIPES20

Учора вийшла Gemini 3. Перше враження від Code generation with Gemini 3 Pro (High): краще до чого я маю доступ. Як це спробувати? - https://aistudio.google.com/ – vibe coding platform - https://geminicli.com/ – coding agent that you can run locally from your terminal. Аналог OpenAI Codex CLI, Aider, Claude Code, etc - https://antigravity.google/ – ще один VS Code з агентом, аналог Cursor/Windsurf/etc. Killer features: Browser Subagent, Artifacts

Why Product Development Isn’t the Same as Outsourcing — and Why Ownership Matters
Why Product Development Isn’t the Same as Outsourcing — and Why Ownership Matters

Рік тому Heroku Open Sources the Twelve-Factor App Definition Я хотів би сказати, як це круто, що проєкт теперь з OpenSource/OpenContribution, а тому тепер рухається швидше. Але, на жаль, це не так. Приклади: 🤔 Питання з використанням файлової системи, яка монтується як Volume для збереження конфігурації, досі не вирішене. А це один зі стандартних підходів у Cloud Native/Kubernetes. 🤔 Чудова ініціатива Twelve-Factor for Generative AI and Agentic Systems за пів року так і не отримала жодного внеску. Причина, як мені здається, банальна: в учасників немає матеріальної зацікавленості працювати. Тому й немає прогресу.

photo content

"Я уникаю Next.js через поганий DevExp" - розшифруйте будь ласка.
Next.js — це закрита екосистема, яка обмежує вибір технологій і підходів. Ось чому: 1️⃣ Деплой та залежність від Vercel Для розгортання Next.js або потрібно використовувати Vercel, або вирішувати безліч додаткових завдань на власному хостингу. Команда Next.js свідомо блокує покращення DevExp для сторонніх платформ. Я це розумію: вони не хочуть створювати конкурентів своєму основному продукту. 2️⃣ Складне усунення помилок Дуже важко зрозуміти джерело проблеми: це Server Components, Turbopack, сам Next.js чи сторонній пакет. 3️⃣ Надмір кількох неявних конвенцій У фреймворку багато прихованих правил (file-system conventions), які не перевіряються лінтерами або самим Next.js. Було б логічно, якби команда дозволила явно зазначати в конфігурації: «ми дотримуємося цієї конвенції», і отримувати помилки або попередження, якщо її порушено. 4️⃣ Монолітність архітектури Підхід “build APIs with Next.js” сприяє створенню монолітних застосунків замість модульної архітектури з окремими деплоями, як у монорепозиторіях. Що я використовую натомість: React Router v7 — дає більше контролю, прозорості й передбачуваності під час розробки.

Для тих, хто у Львові — цікавий мітап FRONTEND CASE EVENING від Skelar 🗓 27 листопада, 18:30 💸 Участь безкоштовна (офлайн + онлайн) 📍Львів (офлайн + онлайн) 🔗 ЗАРЕЄСТРУВАТИСЯ Я б сам сходив, тому короткий огляд доповідей: 🎤 Як ми інтегрували AI у процес код-рев’ю, Ігор Бойко (Liven) Я теж використовую AI у код-рев’ю — цікаво дізнатись, як це працює в мобільній розробці. 🎤 Коли дизайн-система має стати окремим продуктом, Тетяна Мельник (Preply) Як CTO я часто думаю, що дизайн-системи — це зайві витрати. Але бізнес і дизайнери хочуть вирізнятися, тож досвід Preply буде цікавим. 🎤 Тема: TBA, Юрій Артюх (Coderiver) Його доповіді завжди технічно глибокі й натхненні. Що б не розповідав - буде варто почути. 🎤 Як ми побудували кастомний пошуковий двигун на Next.js, Юрій Куцин (RiseGuide) Я уникаю Next.js через поганий DevExp, тож мені менш цікаво. І, звісно, нетворкінг на афтерпаті. Офлайн зараз рідкість, але буде стрім та запис

Сьогодні мав Zoom-coffee з інженером, який перейшов у формат solopreneur (тобто працює самостійно, поєднуючи ролі інженера, підприємця та продакт-менеджера). Він зараз шукає оптимальну бізнес-модель і активно автоматизує власні процеси за допомогою агентів, написаних на Python, використовуючи підхід vibe coding. Знайомий поділився болючою історією: витратив понад 20 годин на пошук і виправлення бага, спричиненого тим, що в одних місцях було написано cancelled, а в інших — canceled. Зрештою з’ясувалося, що розбіжність походить ще з документації, де описувався план для coding-агентів. Тепер він проводить рефакторинг, щоб впровадити StrEnum для уніфікації. Мій особистий висновок із цієї історії: у системному промті варто одразу вказувати, який саме варіант англійської мови (наприклад, USA, що є де-факто стандартом) слід використовувати для документації та коду. Інакше LLM може обрати власний варіант написання, виходячи з контексту.

Під час оновлення eslint-plugin-unicorn до версії 62 я дізнався про String.raw. Він повертає «сирий» рядок без обробки escape-послідовностей. Приклад коду:
// без String.raw const file = `C:\\windows\\temp\\myapp-${process.pid}.log`; const re = `\\d{4}-\\d{2}-\\d{2}`; // із String.raw const file = String.raw`C:\windows\temp\myapp-${process.pid}.log`; const re = String.raw`\d{4}-\d{2}-\d{2}`;
Як же мені бракувало цього знання під час написання міграцій з регулярними виразами CHECK для PostgreSQL. У цих міграціях Unicorn покращив код додавши String.raw

Сьогодні хочу поділитися підходом до обробки помилок бази даних у Nest.js за допомогою Exception Filter. Ключові моменти: 1. Перевірка бізнес-логіки на рівні БД – використання UNIQ/CHECK-обмежень у схемі бази даних. 2. Робота з кодами помилок драйвера – наприклад, обробка стандартних кодів PostgreSQL (23505, 23514, 40001 тощо). 3. Транзакції через typeorm-transactional – оскільки транзакції через @Transaction, фільтр є єдиним місцем, де можна перехопити помилку на рівні запиту. Приклад фільтра, щоб проілюструвати ідею:
import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; import { Catch } from '@nestjs/common'; import { Response } from 'express'; import { DatabaseError } from 'pg'; import { QueryFailedError } from 'typeorm'; @Catch(QueryFailedError) export class TypeormExceptionFilter implements ExceptionFilter { catch(exception: QueryFailedError, host: ArgumentsHost) { const context = host.switchToHttp(); const response = context.getResponse<Response>(); if (exception.driverError instanceof DatabaseError) { if (exception.driverError.code === '40001') { return response.status(409).send({ message: 'Conflict. Please try again later.', }); } if (exception.driverError.code === '23505') { return response.status(400).send({ message: 'Should be unique', }); } if (exception.driverError.code === '23514') { switch (exception.driverError.constraint) { case 'not_negative_balance_check': { return response.status(400).send({ message: 'Not enough balance', }); } //… } } } throw exception; } }
PS Цей метод не скасовує, а доповнює моніторинг журналу помилок вашої бази даних.

🕘 Через 45 хвилин починаємо стрім! Буде цікаво, легко і по-людськи. Побачимось о 21:00 Чекаємо вас на стрімі, щоб відповісти на ваші питання та коментарі 👀 https://www.youtube.com/live/34Yxho1Avu0