Node.js Recipes
3.23K subscribers
174 photos
7 videos
1 file
622 links
По буднях нотатки по #Nodejs розробці, по вихідним огляди конференцій та доповідей (с) @galkin_nikita
Download Telegram
​​AI and Web Development: Hype or Reality
#worth_seeing
Сьогоднішнє відео з конференції JSNation, яка відбулась на початку цього літа. Доповідач Wes Bos, створювач Syntax Podcast та курсів з веб-розробки. У цьому 20-хвилинному відео він демонструє декілька випадків, як штучний інтелект може прискорити процес веб-розробки. На завершення Wes робить висновки, з якими варто ознайомитись. І його останній слайд можна використовувати як принт на футболку:
We're Problem Solvers
Our tools are changing.
Don't ignore it. Stay sharp.

Ось посилання на тему відео:
👀 Відео з JSNation
👀 Відео з Coding Garden
🔗 wesbos.com
🔗 GitHub Next
👍225🤔2
Яким чином налаштовувати конфігурацію додатків у Node.js?

Дванадцятифакторний маніфест стверджує, що для належної конфігурації веб-застосунків необхідно використовувати змінні середовища. У Node.js для локальної розробки прийнято використання пакету dotenv. Його завдання полягає в зчитуванні файлу .env та встановленні значень в process.env. У середовищах, відмінних від локального, цей пакет не є необхідним, оскільки існують сучасні підходи для розгортання Node.js не викорістовують .env.

Добрим тоном є перевірка змінних середовища при запуску. Для цього довгий час я використовував dotenv-safe, який є обгорткою навколо dotenv. Додатковою його функцією є перевірка того, що всі змінні з .env.example визначені. Цього було достатньо для моїх проєктів. Тому мені не здається доцільним перевіряти, наприклад, чи є DB_PORT цілим числом або чи є DB_URL дійсним рядком підключення, як це пропонує документація @nestjs/config. Config - це сінглтон, який ви не будете мокувати у тестах.

Але повернемося до dotenv-safe. Його не оновлювали протягом 4 років. Тому замість нього я використовую такий код у config.ts:
import { readFileSync } from 'node:fs';
import { join } from 'node:path';

import { config, parse } from 'dotenv';

config({ path: join(__dirname, '..', '.env') });
const missedEnvironmentVariables = Object.keys(parse(readFileSync(join(__dirname, '..', '.env.example')))).filter((exampleKey) => !process.env[exampleKey]);
if (missedEnvironmentVariables.length > 0) throw new Error(`${missedEnvironmentVariables.join(', ')} not configured`);

Уважний читач помітить у цьому коді виклик readFileSync, що не рекомендується використовувати. А розуміючий побачить цей виклик readFileSync двічі.

Але незабаром цей типовий код у моїх проєктах зміниться. Справа в тому, що у версії 20 Node.js можна буде припинити використовувати dotenv. Зараз активно обговорюється add built-in .env file support. Це є з коробки в Deno/Bun та скоро буде в Node.js. Докладний розгляд цієї фічі я зроблю, коли вона піде в реліз.
👍47😍4
👍19🤔7😍2🔥1
19 вересня в рамках події Software Architecture fwdays я буду робити доповідь на тему "Exploring MACH Principles". MACH - це скорочення: Microservice, API-First, Cloud Native, Headless. У стартапах я використовую архітектуру, побудовану саме на цих принципах.

Цільова аудиторія конференції – Senior/Lead/Architect, тому під час підготовки доповіді я планую прочитати друге видання книги про мікросервісам. Ту саму, з бджолами на обкладинці, яку написав Сем Ньюман. Бо він теж буде виступати!

Якщо ви ще не читали цю книгу, то рекомендую це зробити. У моїй доповіді я не буду розповідати її зміст. Скоріше, я зосереджуся на microserivce mind set, який дозволяє краще організовувати код та швидше впроваджувати нові можливості...

Здається, я вже почав розповідати зміст доповіді, хоча цей пост мав бути анонсом.Лайкнути мою доповідь, переглянути інших доповідачів та зареєструватися можна тут.
👍413
Поділюсь діалогом, який відбувся в рамках мого консалтингу. Він ілюструє, як з рівня коду дискусія переходить на архітектурний рівень, а потім на її реалізацію на інфраструктурному. У результаті питання по коду просто відпадають.

➡️➡️➡️
привіт. https://xn--r1a.website/node_recipes/330. 2 пункт по фільтрам. Я правильно розумію, що ти пропонуєш сплітити такий сервіс на мікросервіси? Я бачу тут 3 варіанти для hybrid apps:
1) Хендлити в фільтрах по транспортам з контексту - if else
2) Ділити транспорти по мікросервісам. Але експірієнс такий собі. Можливо, в монорепозиторії таке виглядає набагато краще.
3) Бутстрапити два різних NestJsApplication в 1 процесі, у кожного додатка свій набір фільтрів. Ти пробував такий варіант?
⬅️⬅️⬅️
я пробував усі варіанти. розкажи мені яку проблему ти хочеш вирішити hybrid apps
➡️➡️➡️
Мікросервісна архітектура. Мікросервіс відповідає за свій власний домен. Скажімо це billing. На ньому лежить відповідальність ловити вебхуки по HTTP транспорту. Але у інших сервісів може з'явитися потреба запитувати інформацію по підписках, платежах користувачів. Це ось такий приклад в вакуумі. Інші мікросервіси спілкуються через NATS IO, у якого є request/reply, pub/sub, streaming. Виходячи з прикладу, один сервіс підтримує 2 транспорти (http, nats).
В ідеалі в сервісі знаходиться доменна логіка, з власними доменними помилками. При різних транспортах, доменна помилка може оброблятися по-різному. Для HttpException ми знаходимо їй статус, для RpcException http статус нам не потрібен, ми там можемо унікальний ідентифікатор їй видати.
І ось власне які підходи я виділяю:
1) Сплітити такий сервіс на 2 різних, у яких тільки свій транспорт - В результаті отримаємо так собі результат за власним досвідом. Якщо врахувати що для k8s probs потрібно http транспорт все одно сетапити для nats мікросервіса
2) Тримати транспорти в 1 сервісі, але тут почнеться ваханалія в інтерцепторах, фільтрах. Вручну додавати UseInterceptors, UseFilter - не дуже добре для експірієнса. Я цілююся все таки на глобальні фільтри, інтерцептори.
⬅️⬅️⬅️
Я б пішов по третьому шляху. Замість того, щоб в API Gateway виставляти всі мікросервіси яким необхідний реалізовувати webhook, я б зробив один такий мікросервіс. Його завдання слухати події (webhook-и) за межами вашої системи і відправляти їх всередину системи. Плюси такого рішення:
- Гарантованість доставки. Не всі зовнішні системи роблять retry як це робить страйп.
- Розділення прийому зовнішньої події і бізнес логіки по її обробці
- Можливість легко прикрутити Event sourcing саме для зовнішніх подій
Мінуси такого рішення
- Очевидно, не підійде, якщо у вас замість web-hooks використовується RPC over http для інтеграції з зовнішніми системами.
➡️➡️➡️
webhook-gateway який слухає всі вебхуки в системі, можна спробувати. Йому не потрібний буде жодний інший транспорт окрім як http. Потрібно буде запаритися над його high availability, RTO, RPO, якщо він буде включати в себе купу фічей системи.
Використовуючи nats jetsteam можна зробити 1 стрім, класти туди всі пейлоди хуків, а консьюмери вже будуть отримувати потрібні відфільтровані сабжекти.
Можна навіть не робити свій сервіс, а взяти API gateway + lambda
⬅️⬅️⬅️
ти правий. нагадую, що lamda/serverless container/k8s це спосіб розгортання вашого коду. спочатку необхідно на архітектурному рівні визначитися, а потім вже на інфраструктурному.
👍22🔥21
Змушений визнати, що мені не вдається робити відеоконтент у тому вигляді як я хочу. Настав час залишити спроби навчитися робити візуалізацію патернів коду, інфраструктури та архітектури у відео форматі. Це вимагає надто великої кількості зусиль, щоб зробити результат, який би мене влаштував. Мабуть, недаремно на ютубі є формат наукпоп (приклад https://www.youtube.com/@3blue1brown), але немає технопоп для пояснення в такому стилі інженерних концепцій.

У зв'язку з цим зараз опублікую пару опитувань.
👍9😢3
Чи цікаві відео які рекомендуються в постах #worth_seeing? Я їх публікую у вихідні, але вони традиційно мають слабкий відгук. Хочу зрозуміти чому
Final Results
52%
Та я їх дивлюся. Публікація на вихідних чудова ідея
13%
Вони корисні, але не треба публікувати у вихідні
36%
Я їх не дивлюсь.
👍4
Як, і, найголовніше, для чого розпарсювати JWT?

Я не переказуватиму застосування та структуру JWT. Це вже добре зроблено у https://jwt.io/introduction.

Власне питання в заголовку я використовую для перевірки як кандидатів, так і AI. Так минулого літа Copilot пропонував мені лише варіант із викликом методу decode бібліотеки jsonwebtoken. Проте вже наприкінці осені він покращився і зміг запропонувати ще й щось таке:
const payloadBase64 = token.split('.')[1];
if (!payloadBase64) ...
const decodedJson = Buffer.from(payloadBase64, 'base64').toString();
const parsed = JSON.parse(decodedJson) as Record<string, unknown>;

З того часу до часу Copilot додався ChatGPT/Bard/etc, але що вони всі не вміють належним чином записувати jwt.verify помилки у логи. Вони або виводить JWT повністю до логів, створюючи серйозну security уразливість, або взагалі не логують нічого. Що саме логувати залежить від проекту, але нагадаю критерій добрих логів - з них можна зрозуміти, що відбувається з вашим застосунком. Для цього потрібно розпарсувати JWT (до verify або невдачного verify). Тоді можна залогувати його header/payload, але не signature.

На завершення наведу два приклади застосування:
– велика кількість JWT із завершеним строком дії може вказувати на те, що розробники клієнтської частини не контролюють термін дії JWT та не оновлюють його заздалегідь.
– велика кількість JWT з неправильною сигнатурою може свідчити про хакерську атаку або проблеми у процесах DevOps – наприклад, невірний напрямок трафіку через некоректне середовище.
👍32🔥1💩1
Як правильно вибрати тип установки пакета?
😁53🤯7👍2🤨21
Звичайно має бути так. Ставте залежності правильно!
😁31
Зробив тестовий стрим. Не дивлячись на всю підготовку, звичайно, щось пішло не так. Поки що не зрозумів це проблема провайдера чи перегрів роутера.
Із запланованого контенту вийшло лише 15 хвилин. З ним можна ознайомитись, щоб зрозуміти формат. Поки що я його бачу як щотижневий стрим, присвячений продуктовій розробці із застосуванням Node.js. Демонстрації коду у відео немає, але це точно буде.
Дякую всім за підтримку. Наступний ефір буде наступної середи.
🔥30👍6😢1
Новини Node.js розробки за минулий тиждень
#weekly_review

Node.js Security Releases – нові функції відсутні, виправлення безпеки не критичні, тому його можна пропустити.
Announcing TypeScript 5.2 RC – реліз спрямований на підтримку нових фіч EcmaScript: using та Decorator Metadata.
2023 State of the API Report – вийшов щорічний звіт про розробку API, Postman опитав 40000 розробників.
Is Jamstack Toast? – здається, термін вийшов у відставку, але сам підхід залишається актуальним для статичних сайтів.
Google introduced IDX, це web-IDE (Web Visual Studio), на основі Google Cloud Workstations з Codey AI.
👍31
​​Next Gen Package Management
#worth_seeing

Сьогоднішнє відео з конференції REFACTOR DX 2023, що відбулася минулого місяця в Торонто. Як можна здогадатися з назви, вона була присвячена досвіду розробника (Developer Experience). Дарсі Кларк виступив із захоплюючим keynote на заключення першого дня. Дарсі впродовж 4 років очолював інженерію npm. Наразі він працює над своїм стартапом, продовжуючи підтримувати проєкт Node.js та зусилля Фонду OpenJS Foundation у різних робочих групах. З таким багатим досвідом Дарсі дійсно має чим поділитися щодо JavaScript Package Management. Доповідь вийшла зрозумілою та насиченою інформацією, тому настійно рекомендую її переглянути.
👍29
Минуло два місяці, як я рекламував вам eslint-plugin-unicorn. Хочу це зробити ще раз. Якщо у вас його немає на проекті – встановіть його. Встановіть прямо зараз.

Приклади правил, які він додає:
replaceAll замість replace
– заборона використання array.forEach
– імпортування вбудованих модулів тільки з node:

Повний список правил тут. У багатьох є автофікс, тому їх впровадження це питання кількох хвилин.
👍27🤔5🌚2
This media is not supported in your browser
VIEW IN TELEGRAM
За допомогою Postman можна в пару кліків відтворювати запити з Chrome.
👍84😍16🔥3
З Днем Незалежності🇺🇦
Node Recipes – Weekly Review можна подивитися тут
👍5018❤‍🔥1😁1🙏1
Через 4 години наступний огляд новин щодо продуктової Node.js розробки.
Підключайтеся подивитися та поставити запитання.
🔥33👍10
Forwarded from GDG Cloud Kyiv (Nikita)
За годину відбудеться ефір з Нікітою Галкіним та Віктором Турським. Хлопці розберуть новинки, представлені на Google Next 2023.
До зустрічі в ефірі!
👍11
На написання рецептів не вистачає часу. Але я радий з вами поділитися backstage з програми конференції.
Для тих, хто не розуміє причини моєї радості: Matteo Collina – один з найкрутіших Node.js контриб'юторів та автор Fastify.
👍37🔥141