Node.js Recipes – Telegram
Node.js Recipes
3.23K subscribers
167 photos
7 videos
1 file
614 links
По буднях нотатки по #Nodejs розробці, по вихідним огляди конференцій та доповідей (с) @galkin_nikita
Download Telegram
Как узнать ip пользователя в Node.js?
#package #nestjs

TL;DR Знайте заголовок, который использует ваш LB или используйте request-ip.

Хорошей практикой является логирование ip адрес, с которого идет запрос. В определенных случаях в зависимости от ip может строиться логика работы приложения. Наивный способ, приведенный в #nodejs документации выглядит так:

const http = require('http');
const server = http.createServer((req, res) => {
const ip = res.socket.remoteAddress;
const port = res.socket.remotePort;
res.end(`Your IP address is ${ip} and your source port is ${port}.`);
}).listen(3000);

В реально проекте данный способ не будет работать. Node.js процесс будет находиться за load balancer-ом. В req.socket.remoteAddress будет находиться именно его ip, а не откуда пришел запрос. Оригинальный ip можно узнать по заголовку X-Forwarded-For или его аналогам (зависит от используемого LB).

Если у вас нет информации, как будет развернут ваш код, то стоит использовать пакет request-ip. В его коде идет перебор большинства заголовков в поисках ip.

Если же вы знаете используемый LB, то знаете имя заголовка. Вот пример для #nestjs декоратора:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { Request } from 'express';

export const UserIp = createParamDecorator((data: unknown, context: ExecutionContext) => {
const req = context.switchToHttp().getRequest<Request>();
const forwardedFor = req.header('x-forwarded-for');
if (!forwardedFor) return req.connection.remoteAddress;

return forwardedFor.split(',')[0];
});
​​Как получить бесплатную Node.js сертификацию?
#freebies

На прошлой неделе был на подкаст, где среди прочего мы с Ильей Климовым обсуждали сертификацию для #nodejs разработчиков от Linux Foundation. Их существует две:
- JSNSD – OpenJS Node.js Services Developer
- JSNAD – OpenJS Node.js Application Developer

Как и другие сертификации от LF они стоят по 300$. На них регулярно бывают скидки, поэтому покупать их дороже 150$ не рационально... На этом я остановлюсь, иначе это будет пересказ подкаста.

Linux Foundation регулярно раздает купоны на 100% скидку и называет это Linux Foundation Training Scholarships. Для участия достаточно заполнить форму. В случае если вам повезет, то вы получите два промокода: один на сертификацию, второй на платный курс.

В прошлом году я уже участвовал в этой программе и получил CKAD – Certified Kubernetes Application Developer. Распределение по категориям и стипендиатов 2020 можно посмотреть тут. Надеюсь увидеть вас в списке 2021.
Как в Node.js узнать местоположение пользователя?
#service #gcp

В понедельник мы говорили об определение ip пользователя. По нему можно определить местоположение, т.е. страну, город, координаты. Это данные часто используются для построения бизнес-логики.

Начинающие #nodejs разработчики устанавливают geoip-lite. В результате приложение потребляет на 100мб памяти больше. Под капотом у пакета GeoLite база от MaxMind, которая будет находиться в памяти.

Продвинутые разработчики используют сторонний сервис. Например, db-ip.com или geoip2. К сожалению, такие решения нельзя назвать дешевыми.

Наиболее опытные разработчики оптимизируют затраты, и поэтому решают эту задачу в Google Cloud Platform. Один из таких разработчиков написал статью Free IP-based GeoLocation with Google Cloud Functions. В ней описано как создать функционал аналогичный db-ip.com.

В Google Cloud Platform можно настроить custom headers так, что запрос в Node.js будет иметь заголовки с нужными данными.

Аналогичный функционал дает geoip2 модуль для nginx, но он доступен только в nginx-plus.
​​Какую версию npm использовать?
#best_practice #npm #tech_stack

Node package manager – npm регулярно показывает Update available. Следовать этому оповещению и обновлять npm не стоит. Вместе с версией #nodejs идет конкретная версия npm и именно ее следует использовать. Версии указаны в таблице.

Пример текущей LTS комбинации: Node.js v14.16.1, npm v6.14.12. Этому следуют все:
- установочные бинарники,
- nvm (node version manager) и его аналоги,
- Docker image

Использование различных версий npm ведет к различному поведению приложения, трудноуловимым багам и git конфликтам.

Если вы используете yarn, то такой таблицы нет. Лучшей практикой будет использование версию прошитой в Docker image. Например, для Node.js v14.16.1 это будет yarn v1.22.5
​​Free GitLab Certified Associate
#freebies

За последние 12 месяцев GitLab запустил 6 сертификаций различного уровня. GitLab Certified Associate это начальный уровень. Если у вас в резюме нет ни одного бейджа, то рекомендую начать с этого.

Цена без промокода $650. До 30 Апреля 2021 работает E6B8A234458AE3D795. Активация:
1. Создать аккаунт на https://gitlab.edcast.com/
2. Добавить GitLab Certified Associate Pathway в корзину
3. При оплате использовать промокод.

Источник.
​​Как правильно написать package.json в проекте?
#package #best_practices

#Nodejs проект начинается с package.json. Давайте посмотрим как правильно его составить для коммерческого кода.

"name": "@<scope>/<name>"
Хорошая практика использовать scoped package.
"version": "0.1.0"
SemVer рекомендует начинать именно с 0.1.0
"private": true,
Чтобы случайно не опубликовать.
"license":""UNLICENSED"
Поле license описывает тип Open Source лицензии.
Поля "denoscription" и "keywords" используют для поиска в публичном npm. Не указываем их.
"author": "Company Name",
Имя компании обладающей правом на код
"noscripts": { использует одинаковое именование. Единого подхода нет. Подробней
"dependencies": { содержит те пакеты, которые используются в runtime, для FE – во время сборки.
"devDependencies": { содержит пакеты, которые необходимы для локальной разработки и CI/CD.

Все зависимости не меняются руками. Только в посредством npm install/uninstall, чтобы изменился package-lock.json.

Организовать порядок в файле помогает sort-package-json. Ставить его нет смысла, поэтому npx sort-package-json.
👍1
Кодстайл и насилие, Антон Немцев
#worth_seeing

Разработчик читает в десятки раз больше строчек кода, чем пишет. Поэтому кодстайл так важен. Доклад Антона снят в 2018 год. За это время часть инструментов поменялось, но принципы высказанные в докладе актуальны и сейчас.
📕 Slides
Конференции, которые нужно знать:
– Google: I/O '21 18-20 мая, Cloud Next'21 12-14 октября
– Microsoft: Build 25-27 мая
– Facebook: F8 Refresh 2 июня
– Apple: WWDC21 7-11 июня
– AWS: re:Invent 29 ноября - 3 декабря
#conference
На них говорят о вещах, которые меняют нашу отрасль.
6 способов взломать твое JavaScript приложение. Виктор Турский
#worth_seeing #security

В докладе:
- Использование SMS для восстановления пароля
- Загрузка аватарки в файловую систему, а не S3
- Раздача статики средствами #nodejs
- Использование MongoDB
- Server Rendering
- XSS

Во всех примерах, безопасный на первый взгляд код превращается в серьезную проблему в безопасности.
Cloud Study Jam 29-04-2021
#announcement

Мое основное облако – Google Cloud Platform. Если вы с ним не работали, то я вас приглашаю в этот четверг на Cloud Study Jam. В его ходе вы получите свой первый бейдж на qwiklabs.com.
Так же мы посмотрим как сделать свой определитель адреса по IP, о котором я рассказывал тут.
Node.js Recipes pinned «Cloud Study Jam 29-04-2021 #announcement Мое основное облако – Google Cloud Platform. Если вы с ним не работали, то я вас приглашаю в этот четверг на Cloud Study Jam. В его ходе вы получите свой первый бейдж на qwiklabs.com. Так же мы посмотрим как сделать…»
Как узнать источник соединение в БД?
#best_practice #database

TL;DR Всегда ставьте application_name в конфигурации подключения к БД.

Сегодня обсудим малодокументированную фишку баз данных. При создание соединения можно указать application_name. Это аналог http заголовка User-Agent в мире баз данных. Он виден в списке соединений и slow query log. Приведу примеры кода для PostgreSQL.

Без ORM:
import { Client } from 'pg';
const client = new Client({
connectionString: process.env.DB_URL,
application_name: 'my-app@0.1.0'
});

TypeORM
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions';
const dbConfig: PostgresConnectionOptions = {
type: 'postgres',
url: process.env.DB_URL!,
extra: { application_name: 'my-app@0.1.0' },
entities: ...
};

Sequelize
import { Sequelize } from 'sequelize';
const sequelize = new Sequelize(process.env.DB_URL!, {
dialect: 'postgres',
dialectOptions: { appName: 'my-app@0.1.0' }
});


Теперь вы сможете увидеть application_name в pg_stat_activity с помощью запроса
SELECT * FROM pg_stat_activity WHERE datname = '<db_name>';

Аналогичные параметр есть у всех клиентов баз данных.
Например, MongoDB использует appName, а Redis – CLIENT SETNAME.
​​Как вывести в браузер сколько времени обрабатывался запрос на сервере?
#package #browser

Сегодня посмотрим, как можно узнать:
- Как быстро браузер получил ответ?
- А сколько запрос обрабатывался на сервере?

Chrome показывает Server-Timing заголовки. Для этого:
1️⃣Открываем исследуемый ресурс и консоль разработчика.
2️⃣Переходим во вкладку Network.
3️⃣Выбираем нужный запрос.
4️⃣Переходим во вкладку Timing.
5️⃣Смотрим результат.

Есть уже готовый пакет server-timing. Меня он сильно выручил в ситуации, когда было не ясно тормозит #nodejs или load-balancer.
​​Бесплатная месячная подписка на O'Reilly
#freebies

Спасибо, что читаете мой канал об #nodejs. Я стараюсь сделать рецепты короткими, но полезными. Они такие, чтобы читать их на бегу.

К сожалению, книги так не почитаешь. А читать книги необходимо! Лучшие книги по разработке издает издательство O'Reilly (такие с животными на обложке). У них есть замечательный портал learning.oreilly.com. Помимо книг там есть видео и тренировочные сертификации. Отличный контент, который я люблю читать с планшета.

Одна беда – цена 50$/месяц, 500$/год.

У них есть trial 10 дней, но этого мало, чтобы прочитать книгу. По ссылке https://learning.oreilly.com/get-learning/ можно получить 30 дней. Промокод прикреплен снизу.

Приятного чтения!
​​Как померять время выполнения команды в терминале?
#cli

TL;DR Используйте hyperfine

Стандартный способ померять время исполнения команды посредством time.
Пример: time npm run build.

Если time использовать в связке с curl, то можно узнать время выполнения запроса. Для такой задаче лучше подходит ab. Это сокращение от apache benchmark. Это команда отправляет не один запрос на указанный URL, а несколько. На основание результатов считаются статистики: средние, квартили и тп. Поэтому в название и есть benchmark.
Пример: ab -n 10 http://localhost:3000/

Для оценки cli команд тоже есть benchmark. Называется hyperfine. Он может сравнивать несколько команд, делать прогрев или подготовку.
Пример: hyperfine 'npm run build'.
Его удобно использовать в извечном холиваре #nodejs разработчиков: yarn vs npm. Вот так можно сделать сравнение для вашего проекта:
hyperfine --prepare 'rm -rf node_modules' 'yarn' 'npm install'
Обзор Node.js v16: AbortController
#nodejs_api

16-ой версия #nodejs даст нам нативный AbortController. Он создан для отмены выполнение Promise-based функций. Это аналог DOM AbortController, который отменяет fetch запросы.

Ждем появления в коде и на собеседованиях abortable-функций. Уже сейчас SDK cloud-провайдеров (AWS, Azure, GCP) использует полифил. Пример кода:

import { AbortController } from "@azure/abort-controller";
// create a controller and get its signal
const controller = new AbortController();
const abortSignal = controller.signal;
// pass the abortSignal into the API you want to cancel
await blobClient.download({ abortSignal })
// then sometime later, cancel it!
controller.abort();

Для полноценного перехода пока не хватает AbortError. Об это есть issue. Надеюсь ее закроют до выхода 16-й LTS.
👍1
Почему разработчикам необходимо знать Cloud сервисы?
#cloud

В одном из #nodejs чатов прилетел вопрос "Подскажите, нужна либа которая из текста делает озвучку и сохраняет ее. Куда копать?" (c)

Вот варианты решения задачи Text-To-Speach:
1️⃣Web Speech API, необходим запущенный браузера.
2️⃣Использовать Node.js только для запуска child_process.
3️⃣Vendor hosted, Использовать стороннего сервиса
4️⃣Cloud Native, т.е. использования сервисов предлагаемых облаком

Когда бизнесу важна скорость выхода на рынок, то Cloud Native безусловный фаворит. Поэтому я бы рекомендовал начать с родного облака:

☁️ AWS предлагает Polly
☁️ GCP предлагает @google-cloud/text-to-speech
☁️ Azure предлагает microsoft-cognitiveservices-speech-sdk
👍1
Вы заметили в вашем Docker Desktop вкладку Dev Environments? Там пока нет ничего кроме интро видео. Мы узнаем детали 27 мая на DockerCon Live 2021.

➡️ Бесплатная регистрация
#conference #docker #freebies
Diagnostic Reports by Christopher Hiller
#worth_seeing #nodejs_api

Сегодня у нас доклад с Node+JS Interactive 2019. С 2020 года эту конференцию заменил OpenJS World (подробней тут). Доклад короткий, всего 20 минут. В нем Кристофер рассказывает зачем нужны Diagnostic Report и как использовать его утилиту report toolkit.

Ссылки из доклада:
➡️ документация
📕 Slides
💻 утилита report toolkit

В завершение, приведу пример как на Diagnostic Report  сделать аналог phpinfo():
exports.helloWorld = (req, res) => {
res.status(200).send(process.report.getReport());
};
Подборка node.recipes за апрель 2021
#monthly_list

Рецепты для #nodejs разработчиков:
➡️ Когда можно считать, что вышла новая версия Node.js?
➡️ Как правильно настроить TypeScript в Node.js проекте?
➡️ Как исправить код в node_modules?
➡️ Как протестировать webhook локально?
➡️ Как изменить timezone (часовой пояс) в Node.js?
➡️ Сравнение Nest.js и Koa.js с точки зрения бизнеса
➡️ Как конфигурировать Node.js приложение?
➡️ Как узнать ip пользователя в Node.js?
➡️ Как в Node.js узнать местоположение пользователя?
➡️ Какую версию npm использовать? 
➡️ Как правильно написать package.json в проекте?
➡️ Как узнать источник соединение в БД?
➡️ Как вывести в браузер сколько времени обрабатывался запрос на сервере?
➡️ Как померять время выполнения команды в терминале?
➡️ Обзор Node.js v16: AbortController
➡️ Почему разработчикам необходимо знать Cloud сервисы?

freebies:
🤑 Как получить бесплатную Node.js сертификацию?
🤑 Free GitLab Certified Associate
🤑 Бесплатная месячная подписка на O'Reilly

Доклады, которые стоит посмотреть:
👀 The Benefits of a “CLI First” Development Strategy
👀 Serverless Sockets for Real Time 
👀 GraphQL Summit Worldwide
👀 Can we double HTTP client throughput?
👀 Кодстайл и насилие
👀 6 способов взломать твое JavaScript приложение

Конференции, которые стоит посетить:
🎤 OpenJS World 2021
🎤 StrapiConf
🎤 Подборка конференций от Cloud провайдеров
Node.js Recipes pinned «Подборка node.recipes за апрель 2021 #monthly_list Рецепты для #nodejs разработчиков: ➡️ Когда можно считать, что вышла новая версия Node.js? ➡️ Как правильно настроить TypeScript в Node.js проекте? ➡️ Как исправить код в node_modules? ➡️ Как протестировать…»