Node.js Recipes – Telegram
Node.js Recipes
3.23K subscribers
167 photos
7 videos
1 file
611 links
По буднях нотатки по #Nodejs розробці, по вихідним огляди конференцій та доповідей (с) @galkin_nikita
Download Telegram
Вышла Node.js 14.17.1
#nodejs_api

Вышла патч версия. Изменения:
➡️ Модуль ICU обновлен с 68.1 на 69.1. Этот модуль, International Components for Unicode, отвечает за локализацию, таймзоны и прочее. Пример кода на где они используется new Date().toLocaleString()
Потенциальный breaking change, если ваша бизнес логика использует нативный модуль локализации. Рабочая группа не первый раз делает релиз с новой версией ICU в патч версии. Поэтому на проекта, где используется эта фича я рекомендую использовать собственную сборку Node.js с флагом --with-intl=system-icu Подробней в документации.

➡️ Улучшены вывод errors stacks при использование флага --enable-source-maps
Было
Error: an exception
at branch (*typenoscript-throw.js:20:15)
-> *typenoscript-throw.ts:18:11*
at Object.<anonymous> (*typenoscript-throw.js:26:1)
-> *typenoscript-throw.ts:24:1*
at Module._compile (node:internal/modules/cjs/loader:*)
Стало
Error: an exception
at *typenoscript-throw.ts:18:11*
at *typenoscript-throw.ts:24:1*
at Module._compile (node:internal/modules/cjs/loader:*)
Нативная альтернатива пакету source-map-support
Migration to Google Cloud or How to Train your Pet
#worth_seeing

Сегодня в рекомендованных видео от дружественного комьюнити Math.random(). Его можно описать как case study. Владимир Врещ рассказывает о своем пэт проекте. Сначала о том, как он разворачивал его на Google Cloud, а потом на on premise.

Хорошие моменты на видео:
➡️оптимизация затрат в cloud-native подходе с помощью server-less
➡️ качественные диаграммы архитектуры
➡️ использование реверс индекса для поиска
➡️ отзывы на используемые инструменты
➡️ различие Cloud-native и on premise подходов

Рекомендую к просмотру не только видео, но и сам проект. У него открытый исходный код. Там есть что разобрать и #nodejs, и frontend разработчикам.

Ссылки:
🔗 Личный сайт Владимира https://vreshch.com/
🔗 Проект https://crystallography.io/
🔗 Исходный код https://github.com/chemistry
🔗 Хостинг для on premise https://www.hetzner.com/
DDD, event sourcing and CQRS – theory and practice
#worth_seeing

Возможно, вы были в этот вторник на митапе, где был доклад Богдана Савшака по DDD. Domain-driven design переводиться как предметно-ориентированное проектирование. Сегодня же я рекомендую вам посмотреть лучший доклад для #nodejs разработчиков по данной теме.

Докладчик Golo Roden отлично раскрывает эту тему. В ходе доклада по мимо DDD, он использует концепции CQRS и Event Sourcing. Получается отличная синергия. Стиль доклада написание и объяснение псевдокода, а не работа со слайдами. Это определенно уровень.
#conference #graphql

Hasura упрощает создание GraphQL API. Именно об этой технологии 23-24 июня пройдет конференция Hasura Day. Это Vendor-конференция. В течение двух дней будут доклады, воркшопы и дискуссионные панели. Участие бесплатно.

Напоминаю об том, что прямой конкурент тоже проводить свою конференцию – Prisma Day. Если GraphQL входит в ваш круг интересов рекомендую посетить обе конференции.
Как тестировать Dockerfile?
#package #docker

При анализе проектов я часто вижу, что нет проверки Dockerfile. Так на одном из проектов выяснилось, что сборка Docker image сломана два с половиной месяца.
Поэтому CI должен проверять, что:
➡️ Docker image собирается
➡️ Docker container стартует
➡️ health-check отдает успешный ответ

Если на проекте существуют e2e тесты, то #nodejs необходимо запускать как и в продакшене – как контейнер. Для этого отлично подходит пакет testcontainers. Он позволяет работать с Docker контекстом из кода. Вот пример из документации:

const path = require("path");
const { GenericContainer } = require("testcontainers");
const buildContext = path.resolve(__dirname, "dir-containing-dockerfile");
const container = await GenericContainer.fromDockerfile(buildContext)
.withBuildArg("ARG_KEY", "ARG_VALUE")
.build();
const startedContainer = await container
.withExposedPorts(8080)
.start();
#freebies

В апреле я писал как получить месячную подписку на O'Reilly. Для этого переходим https://learning.oreilly.com/get-learning/ и используем промокод GDGCR20.

O'Reilly продает подписку к своим книгам за 500$ в год. Ее можно получить за 25$ в год. Существует организация ACM – Association for Computing Machinery и для ее членов подписка включена в орг взносы. Для развивающихся стран, куда мы с вами входим, орг. взносы составляют 25$ в год. Никаких обязательств участие в ACM не накладывает.

Кроме подписки на O'Reilly организация ACM дает доступ к Skillsoft и ScienceDirect, подробней.
Для создания учетной записи кликаем сюда и выбираем страну из списка. После регистрации и оплаты будет создан email на домене acm.org. Его необходимо использовать для авторизации на O'Reilly.

Update: От 29 июля. Было изменение цен. Профессиональная 99$, студенческая 19$.
Update 2022: ACM прекратило сотрудничество
👍1
Redis University
#freebies 

Разработчики часто используют Redis как кэш. Чтобы лучше разбираться в этом инструменте я рекомендую пройти Redis University. В нем есть несколько курсов, которые регулярно обновляются.

Для #nodejs разработчиков полезны:
RU101 ➡️ Introduction to Redis Data Structures
RU102JS ➡️ Redis for JavaScript Developers
RU202 ➡️ Redis Streams
RU203 ➡️ Querying, Indexing, and Full-Text Search

Если вы отвечаете за инфраструктуру, то стоит еще пройти:
RU301 ➡️ Running Redis at Scale
RU330 ➡️ Redis Security

По окончания любого курса выдается сертификат, которым можно усилить ваше резюме. Не путайте его с сертификацией, которая стоит 120$ и включает в том числе бейдж. Она называется Redis Certified Developer и проходит под контролем живого человека. Подробней тут
Здравствуйте, друзья!

Хочу пригласить вас на доклад, о перспективном node.js фреймворке NestJS. А расскажет нам о нем Никита Галкин - человек, который знает очень много о бекенде на node.js и охотно делится с миром своими знаниями!

Никита ведет telegram канал - @node_recipes, подписывайтесь и вы найдете большое количество качественных материалов о node.js.

Подробности доклада и регистрация - https://mathrandom.com/webinar01072021

Дата: 1 июля 18:00

#nodejs #nestjs #event #stream #nikitagalkin
Live stream scheduled for
Что такое timing attack (атака по времени)?
#security #package

TL;DR Не используйте сравнение строк через === при проверке равенства секретов или токенов. Используйте безопасные сравнение с фиксированным временем – secure-compare

В веб-разработке мы часто не задумываемся об классической атаке на систему через анализ времени ответа. Исследование 2009 года показывает, что злоумышленник может измерять события с точностью 15–100ms в Интернете и с точностью 0.1ms в локальной сети.

Пример кода уязвимого к данной атаке:
function isAuthenticated(user, token) {
var correctToken = FetchUserTokenFromDB(user);
return token === correctToken;
}

Такое сравнение обрывается на первом же различном символе, поэтому можно по времени ответа подбирать ответ.

Безопасное по времени сравнение выглядит так:
let mismatch = 0;
for (var i = 0; i < a.length; ++i) {
mismatch |= (a.charCodeAt(i) ^ b.charCodeAt(i));
}
return mismatch;

Его можно использовать из пакета secure-compare.

Мне доводилось участвовать в спорах, где оппоненты говорили, что тут нет риска, так как задержка на запрос в базу данных и/или latency ответа не дадут злоумышленнику достаточно информации. Аргументы здравые. Вместо того, чтобы с ними спорить я задаю вопросы:
- есть ли в драйвере кэш запросов? Как он работает?
- Откуда злоумышленник проводить атаку из внешней или внутренней сети?
- Насколько большие затраты делать безопасное сравнение в сравнение с закрываемыми рисками?
Audio
#voice_chat #security

Гость: Анастасия Войтова, секурити инженер в cossacklabs.com. Занимается безопасностью и защитой данных.

Топ 5 security проблем типичного веб-проекта
Управление рисками и угрозами – как понять, какие штуки по безопасности нужны в твоем проекте, а какие нет
SSDLC, SAMM — какие тулы/подходы на каждом этапе разработке софта
Где и как учить основы security? Углублено?
Как выглядит найм security engineer? Карьеры
Что в облаках сделано хорошо для обеспечение security, а что необходимо реализовывать самостоятельно?

Ссылки от Анастасии:
- Личный блог
- Корпоративный блог
- Об интернатуре

OWASP cсылки:
- https://owasp.org/www-project-top-ten/
- https://github.com/OWASP/ASVS
- https://owaspsamm.org/model/
Live stream started
Live stream finished (1 hour)
Что такое JSON Patch?
#architecture

Для простоты примера рассмотрим Todo-list. Приходит задача добавить копирование одного todo элемента. Как вы ее спроектируете? Это реальный вопрос с собеседований.

Можно, переложить задачу на FE, чтобы он воспользовался существующим endpoint-ом для создания. Не удобно для массового копирования или добавления другой бизнес логики.

В REST существуют два метода для обновления PUT – полное обновление и PATCH – частичное. Мое решение поставленной задачи:

PATCH /todos
[{ "op": "copy", "from": "/todos/uuid", "path": "/todos/new-uuid" }]

Обратите внимание, что я использую PATCH не к отдельному элементу, а к ресурсу коллекции. За этим запросом стоит такая логика: FE генерирует новый UUID как и при создание, а потом говорит BE скопируй контент из существующего todo.

Тело запроса представляет собой JSON Patch, который описывает как изменить JSON документ. По сути это набор операций которые необходимо произвести над JSON документом. Большинство Web API состоят из JSON документов, поэтому можем использовать готовый RFC. Одна строничная документация с операциями и определением JSON Pointer по ссылке http://jsonpatch.com/
NestJS. When patterns matters
#worth_seeing #nestjs

Сегодня у нас доклад с VinnytsiaJS 2017, которое можно назвать обзорным. 4 года назад я смотрел его, когда у Nest.js не было так подробно расписана документация, не было комьюнити. Для кого это тот доклад стал толчком к изучению всего Nest.js стэка.

Зрелость технологии определяется ее стабильностью. Может считать это видео подтверждением, что Nest.js стабилен и его стоит использовать.
VinnytsiaJS 2021
#conference

Винницкое JS комьюнити @vinjs проводит 21 августа оффлайн конференцию.
Формат традиционный для летних конференций – Open Air: бассейн, нетворкинг и JS доклады.

Я буду выступать на этой конференции с темой "Cloud Native Approach for Node.js Developers". Программа еще в стадии формирования, поэтому приглашаю коллег подать заявку на доклад.
Cloud Native Landscape for Node.js Developers
#worth_seeing #cloud

При просмотре описания докладов на OpenJS World 2021 я подумал, что речь будет идти об Cloud Native Landscape. Это страница где собраны проекты участвующие в Cloud Native Foundation. Я ошибся. Докладчик делает обзор самого подхода, а не инструментов.

Slides
Какие подписки читать Node.js разработчику?
#list

Поделюсь списком моих email подписок:
JavaScript Weekly
Node Weekly
TypeScript Weekly
Web Tools Weekly
GraphQL Weekly
StackShare Weekly Digest

В подписках релизы инструментов, подборки статей и новости. У каждой есть архив, где можно понять качество контента.

Отдельно выделю Adventures in Nodeland by Matteo Collina как авторскую рассылку.
👍1
Как работает query в REST?
#architecture #nestjs

Вопрос с собеседований: "Чему равно id во время выполнения такого запроса:?id=1&id=2"

Какой ответ дадите вы?
- будет ошибка, нельзя использовать два раза один параметр
- 1, потому что first win
- 2, потому что last win
- [1, 2]

В списке нет правильного ответа. Согласно спецификации это должен быть массив, но массив строк, а не чисел. Приведение типов это не часть парсинга строки.

Для передачи массива параметров в query есть такие варианты:
1️⃣?foo=bar&foo=qux
2️⃣?foo[]=bar&foo[]=qux
3️⃣?foo%5B%5D=bar&foo%5B%5D=qux
4️⃣?foo=bar,qux

Какой способ выбрать зависит от того какой framework или библиотеку вы используете. Для #nodejs разработчики использующих express ближе всего будет 2-й способ. По умолчанию express используют extended query parser, то есть использует qs. Эта библиотека учитывает [] при парсинге.
Помогите лучше понимать аудиторию канала.

Junior Software Engineer - 97
👍👍👍👍 20%
Software Engineer - 215
👍👍👍👍👍👍👍👍 44%
Senior Software Engineer - 110
👍👍👍👍👍 22%
Team/Technical Lead - 55
👍👍👍 11%
System Architect - 14
👍 3%
👥 491 человек уже проголосовал.
Подборка node.recipes за июнь 2021
#monthly_list

Рецепты для #nodejs разработчиков:
➡️ Какие директивы есть в TypeScript и зачем их использовать?
➡️ Где брать сниппеты кода?
➡️ Обзор Node.js v16: Timers Promises API
➡️ Что должен знать Junior Node.js Developer?
➡️ На что влияет environment variable EDITOR?
➡️ Как работает ORM?
➡️ Что должен уметь написать Senior Node.js разработчик?
➡️ Что такое Custom URL Protocol Scheme?
➡️ Что такое Graceful Shutdown и как его реализовать?
➡️ Как тестировать Dockerfile?
➡️ Что такое timing attack (атака по времени)?
➡️ Что такое JSON Patch?
➡️ Какие подписки читать Node.js разработчику?
➡️ Как работает query в REST?

Обзор релизов:
🚀 Node.js 14.17.1

Freebies:
🤑 O'Reilly books
🤑 Redis University

Доклады, которые стоит посмотреть:
👀 Consuming Nodejs Observability Features in Kubernetes Environments
👀 Node.js middleware - никогда больше
👀 Observing Node.js: Using Metrics to Improve your Application Performance
👀 Demystifying Database Performance Issues with sqlcommenter
👀 Migration to Google Cloud or How to Train your Pet
👀 DDD, event sourcing and CQRS – theory and practice
👀 NestJS. When patterns matters
👀 Cloud Native Landscape for Node.js Developers

Voice Chats:
🎤 About Cloud Native, в гостях Николай Крещенко
🎤 About Metarhia and Node.js, в гостях Тимур Шемсединов
🎤 About Security, в гостях Анастасия Войтова