Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня хочу поделиться небольшим трюком.
Мне не нравится постоянно включать и выключать VPN на телефоне, чтобы открыть что-либо в браузере.
Я воспользовался приложением Быстрые команды (Shortcuts) на своем Айфоне, вероятно, нечто подобное есть и на других платформах.
Кратко говоря, я сделал небольшой скрипт, который автоматически включает VPN в момент открытия определенных приложений и выключает его, когда одно из них закрывается.
Прикладываю видео примера и скрин из Быстрых команд.
Про разворачивание собственного VPN расскажу в будущих постах.
#ios #iphone #vpn
Мне не нравится постоянно включать и выключать VPN на телефоне, чтобы открыть что-либо в браузере.
Я воспользовался приложением Быстрые команды (Shortcuts) на своем Айфоне, вероятно, нечто подобное есть и на других платформах.
Кратко говоря, я сделал небольшой скрипт, который автоматически включает VPN в момент открытия определенных приложений и выключает его, когда одно из них закрывается.
Прикладываю видео примера и скрин из Быстрых команд.
Про разворачивание собственного VPN расскажу в будущих постах.
#ios #iphone #vpn
Пришел тут на проект. Сильное легаси. Стали разбираться, разгребать код. Про его качество я умолчу, но вот интересная статистика в целом по количеству строк.
Javascript поражает воображение. Пустых строк и комментов почти столько же, сколько и самого кода.
Html файлы по 6000 строк, в которых всё: JS, CSS, HTML, запросы в БД. Вероятно, что в 2010 не думали о модулярности кода и необходимости его поддерживать спустя годы.
#code #javascript
Javascript поражает воображение. Пустых строк и комментов почти столько же, сколько и самого кода.
Html файлы по 6000 строк, в которых всё: JS, CSS, HTML, запросы в БД. Вероятно, что в 2010 не думали о модулярности кода и необходимости его поддерживать спустя годы.
#code #javascript
Я постоянно слушаю музыку за компом, наушники не люблю или не всегда удобно.
Купил я себе китайский саундбар от Сяоми. Модель ASB02A. Штука прикольная, я не то, чтобы фанат чистого звука, потому колонка вполне устроила.
Бесило только, что когда включается, говорит по-китайски, особенно на старте компа дважды подключается и дважды повторяет что-то.
Решил просто из любопытства загуглить, может есть прошивки какие-то или вроде того, наткнулся на пост на ответах mail.ru (!!!), где человек выдал базу в виду инструкции по прошивке.
Действительно, на каком-то сугубо китайском сайте лежит китайская инструкция как прошить эту колонку на прошивку, в которой нет голоса на старте. Вот чудо.
Конечно, без бубнов не обошлось. Делал все по инструкции, старая прошивка удалилась, а вот новая, как ни крути, не вставала. Я подумал уже, что убил колонку и наткнулся на коммент пользователя с той же ситуацией.
Однако удалось все решить перемещением всех файлов прошивки из папки Загрузки в единую папку на рабочий стол. Видимо в путях к файлам мешали пробелы, так как пробелы, как я понял, в письме китайцы особо не используют.
#firmware #xiaomi
Купил я себе китайский саундбар от Сяоми. Модель ASB02A. Штука прикольная, я не то, чтобы фанат чистого звука, потому колонка вполне устроила.
Бесило только, что когда включается, говорит по-китайски, особенно на старте компа дважды подключается и дважды повторяет что-то.
Решил просто из любопытства загуглить, может есть прошивки какие-то или вроде того, наткнулся на пост на ответах mail.ru (!!!), где человек выдал базу в виду инструкции по прошивке.
Действительно, на каком-то сугубо китайском сайте лежит китайская инструкция как прошить эту колонку на прошивку, в которой нет голоса на старте. Вот чудо.
Конечно, без бубнов не обошлось. Делал все по инструкции, старая прошивка удалилась, а вот новая, как ни крути, не вставала. Я подумал уже, что убил колонку и наткнулся на коммент пользователя с той же ситуацией.
Однако удалось все решить перемещением всех файлов прошивки из папки Загрузки в единую папку на рабочий стол. Видимо в путях к файлам мешали пробелы, так как пробелы, как я понял, в письме китайцы особо не используют.
#firmware #xiaomi
👍3🔥2
У меня как-то случай был, который до сих пор вызывает вопросы. Я когда собирал свой комп, поставил в него 16гб ОЗУ DDR4. Вот такие. Это был 2021 год.
В 2025 году я купил на Яндексе ровно такие же две планки, и в сумме теперь у меня в компе 32гб ОЗУ:
Прикол был в том, что как только я поставил две эти новые планки в комп, у меня сразу же отлетела винда. Точнее, загрузчик. Я стал загружаться в БСОД и никакой Стрелец или MSDart не помог восстановиться. Пришлось ставить чистую систему, но зато я в этот раз включил XMP и поднял частоту ОЗУ до 3200 МГц (вместо дефолтных 2000).
Когда я собирал этот комп, я не шарил за автоматический разгон, Думал, что все само работает из коробки.
В общем, так я и не понял как связаны планки ОЗУ и загрузчик на жестком диске. Может быть истина представит себя позже.
#Windows
В 2025 году я купил на Яндексе ровно такие же две планки, и в сумме теперь у меня в компе 32гб ОЗУ:
Процессор
AMD Ryzen 7 5700X 8-Core Processor 3.40 GHz
Оперативная память
32,0 ГБ DDR4 3200
Память
1.82 TB HDD WDC WD20EZRZ-22Z5HB0,
466 GB SSD Samsung SSD 970 EVO Plus 500GB, - Диск с виндой (NVMe)
Видеоадаптер
NVIDIA GeForce RTX 3060 (12 GB)
Материнская плата:
Gigabyte B550 Aorus Elite
Тип системы:
Выпуск
Windows 10 Pro
Версия
22H2
Дата установки
22.09.2025
Сборка ОС
19045.6332
64-разрядная операционная система, процессор x64
Прикол был в том, что как только я поставил две эти новые планки в комп, у меня сразу же отлетела винда. Точнее, загрузчик. Я стал загружаться в БСОД и никакой Стрелец или MSDart не помог восстановиться. Пришлось ставить чистую систему, но зато я в этот раз включил XMP и поднял частоту ОЗУ до 3200 МГц (вместо дефолтных 2000).
Когда я собирал этот комп, я не шарил за автоматический разгон, Думал, что все само работает из коробки.
В общем, так я и не понял как связаны планки ОЗУ и загрузчик на жестком диске. Может быть истина представит себя позже.
#Windows
👍1🔥1
Интересные сочетания клавиш в Windows, которыми я постоянно пользуюсь:
Еще во времена Win7 было очень удобное сочетание
Не знаю уж какая была мотивация у Майкрософт, но с Windows 10 это сочетание стало открывать Проводник, который, чисто по моему скромному мнению, не уперся никому.
Однако, это поведение управляемое и в настройках вида папки можно вернуть открытие Моего компьютера.
#Windows #Hotkeys
Еще во времена Win7 было очень удобное сочетание
Win + E. Оно открывало Мой компьютер, что помогало избегать поиска ярлыка на рабочем столе или в Пуске.Не знаю уж какая была мотивация у Майкрософт, но с Windows 10 это сочетание стало открывать Проводник, который, чисто по моему скромному мнению, не уперся никому.
Однако, это поведение управляемое и в настройках вида папки можно вернуть открытие Моего компьютера.
#Windows #Hotkeys
🔥2❤🔥1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
В продолжении темы горячих клавиш еще хочу поделиться опытом работы с несколькими мониторами.
Сейчас, занимаясь разработкой и в целом проводя огромную часть времени за компьютером, я не представляю свой рабочий день без второго монитора. Более того, дома в качестве третьего монитора у меня еще подключен телевизор, с которого я смотрю кино или отрываю лица в очередном зомби-шутере.
Я постоянно пользуюсь этими сочетаниями, чтобы перекидывать окна приложений с одного монитора на другой.
PS. Arrow keys - стрелки на клавиатуре.
Бонусом прикольная гифка от Майкрософт, новый год не за горами.🎄
#Windows #Hotkeys
Сейчас, занимаясь разработкой и в целом проводя огромную часть времени за компьютером, я не представляю свой рабочий день без второго монитора. Более того, дома в качестве третьего монитора у меня еще подключен телевизор, с которого я смотрю кино или отрываю лица в очередном зомби-шутере.
Я постоянно пользуюсь этими сочетаниями, чтобы перекидывать окна приложений с одного монитора на другой.
Win + Shift + Left Arrow KeyWin + Shift + Right Arrow KeyPS. Arrow keys - стрелки на клавиатуре.
Бонусом прикольная гифка от Майкрософт, новый год не за горами.
#Windows #Hotkeys
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Так же для работы с окнами удобное сочетание
Используя стрелки на клавиатуре, можно прикрепить окно к любой части экрана, помогает навести порядок в открытых приложениях, особенно когда нужно два окна поставить рядом для сопоставления документов или писать код и читать документацию.
Ну либо чатиться в тележке и смотреть стрим Papr1k4🗿 .
#Windows #Hotkeys
Win + Arrow key.Используя стрелки на клавиатуре, можно прикрепить окно к любой части экрана, помогает навести порядок в открытых приложениях, особенно когда нужно два окна поставить рядом для сопоставления документов или писать код и читать документацию.
Ну либо чатиться в тележке и смотреть стрим Papr1k4
#Windows #Hotkeys
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1❤🔥1
Всяких классных сочетаний, которые сильно ускоряют работу, много, но сегодняшнюю серию постов я закончу на последнем сочетании, связанном с окнами. И это я сам открыл довольно недавно.
Представляю вам Рабочие столы. Начиная с Win10, кажется, c помощью сочетания
Один рабочий стол для кода, второй для просмотра видео и чата, третий для работы с почтой и документами.
Мозг очень долго привыкал к концепту, но теперь это очень удобно и действительно помогает держать рабочее место в чистоте без открытого Хрома с миллионом вкладок.
С помощью
#Windows #Hotkeys
Представляю вам Рабочие столы. Начиная с Win10, кажется, c помощью сочетания
Win + Tab можно открыть представление всех открытых приложений и добавить виртуальный рабочий стол. Очень полезно для разделение работы по смыслу. Один рабочий стол для кода, второй для просмотра видео и чата, третий для работы с почтой и документами.
Мозг очень долго привыкал к концепту, но теперь это очень удобно и действительно помогает держать рабочее место в чистоте без открытого Хрома с миллионом вкладок.
С помощью
Win + Ctrl + Arrow keys можно переключаться между столами, что делает эту фичу еще более удобной и встраиваемой в рабочий поток.#Windows #Hotkeys
❤🔥1❤1🔥1
Вероятно, кто-то уже подобное видел, но лично для меня видеть код, написанный на Кириллице в 1С, это что-то ретрофутуристичное.
Сразу воображаю себе мужей в белых научных халатах и запуски спутников под Sovietwave.
Довелось на проекте позаниматься интеграцией веб-приложения с 1С ERP. В частности, занимался исправлением нерабочей обработки, которая выгружала информацию по одежде в приложение, над которым мы сейчас работаем. В конфигураторе 1С даже нумерация строк кода не по каждой строке, как в том же VSCode, а в правом нижнем углу в строке состояния.
Не знаю, чего я вообще ожидал от 1С, но в ней есть тот же Rest API, экспорт данных в JSON и XML. Полноценная работа с запросами, отладка, точки останова. Всё, как у взрослых. До этого момента я толком вообще ничего не знал про 1С, а сейчас кажется, что это даже не так плохо, как рисуют люди, а коллеги вообще хвалят, ругают только сомнительную "кастомизацию" на отдельных предприятиях.
На секунду представил, какого это писать каждый день код на своем родном языке и не затирать без конца Shift + Alt, чтобы поменять язык, особенно, когда нужно постоянно что-то гуглить и читать стэк.
#Code #1C
Сразу воображаю себе мужей в белых научных халатах и запуски спутников под Sovietwave.
Довелось на проекте позаниматься интеграцией веб-приложения с 1С ERP. В частности, занимался исправлением нерабочей обработки, которая выгружала информацию по одежде в приложение, над которым мы сейчас работаем. В конфигураторе 1С даже нумерация строк кода не по каждой строке, как в том же VSCode, а в правом нижнем углу в строке состояния.
Не знаю, чего я вообще ожидал от 1С, но в ней есть тот же Rest API, экспорт данных в JSON и XML. Полноценная работа с запросами, отладка, точки останова. Всё, как у взрослых. До этого момента я толком вообще ничего не знал про 1С, а сейчас кажется, что это даже не так плохо, как рисуют люди, а коллеги вообще хвалят, ругают только сомнительную "кастомизацию" на отдельных предприятиях.
На секунду представил, какого это писать каждый день код на своем родном языке и не затирать без конца Shift + Alt, чтобы поменять язык, особенно, когда нужно постоянно что-то гуглить и читать стэк.
Если Не ЗначениеЗаполнено(УзелПриложения) Тогда
Текст = НСтр("ru = 'Не заполнено поле ""Получатель""'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст,,,"УзелПриложения");
Возврат;
КонецЕсли;
// Павлова 27.10.2025+
ВыгрузитьВСтаромФормате = ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(УзелПриложения, "ИспользоватьСтарыйФорматВыгрузки");
Если Не ВыгрузитьВСтаромФормате тогда
АдресФайла = СформироватьФайлXML(ЗадачаПАКСИЗ);
Данные = ПолучитьИзВременногоХранилища(АдресФайла);
Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
Возврат;
КонецЕсли;
ИмяФайла = Формат(ТекущаяДата(),"ДФ=гггг_ММ_дд-чч_мм_сс")+".xml";
РезультатОтправки = ОтправитьФайлНаСервере(АдресФайла,ИмяФайла);
Если РезультатОтправки.Успешно = Ложь Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(РезультатОтправки.ОписаниеОшибки);
КонецЕсли;
Иначе
ТекущиеДанные = ОбщегоНазначенияУТВызовСервера.ЗначенияРеквизитовОбъекта(ЗадачаПАКСИЗ, "Основание, ВидОперации");
Если ЗначениеЗаполнено(ТекущиеДанные.Основание) тогда
ВыгрузкаRENTНаСервере(ТекущиеДанные);
КонецЕсли;
КонецЕсли;
// Павлова 27.10.2025-
КонецПроцедуры
#Code #1C
❤2👍2
Я в качестве хобби собираю приставки Playstation.
Эта тема заслуживает отдельного поста, а задел я ее лишь потому, что собрал архив игр для Playstation 2, который составляет почти терабайт. Естественно, пришлось каждую игру упаковать в архив, чтобы сэкономить место. Спустя я время, я уже забыл какой был общий размер всех файлов, но мне нужно было это знать, чтобы понять какого размера понадобится память.
Мы, программисты, ленивые. Мы не будем делать что-то, что займет час, если это можно автоматизировать за восемь. Я так и сделал. Целый день провел за изучением и тестированием Powershell, чтобы он брал все архивы в папке, брал их несжатый размер из метаданных, складывал вместе и выдавал. Для его работы нужен установленный 7zip.exe. Я еще подумаю, как его интегрировать в скрипт, чтобы не было обязательной его предварительная установка. Но пока получилось вот это:
#Playstation #7zip #Powershell
Эта тема заслуживает отдельного поста, а задел я ее лишь потому, что собрал архив игр для Playstation 2, который составляет почти терабайт. Естественно, пришлось каждую игру упаковать в архив, чтобы сэкономить место. Спустя я время, я уже забыл какой был общий размер всех файлов, но мне нужно было это знать, чтобы понять какого размера понадобится память.
Мы, программисты, ленивые. Мы не будем делать что-то, что займет час, если это можно автоматизировать за восемь. Я так и сделал. Целый день провел за изучением и тестированием Powershell, чтобы он брал все архивы в папке, брал их несжатый размер из метаданных, складывал вместе и выдавал. Для его работы нужен установленный 7zip.exe. Я еще подумаю, как его интегрировать в скрипт, чтобы не было обязательной его предварительная установка. Но пока получилось вот это:
function Get-ArchiveSizeInfo {
param (
[string]$ArchivePath,
[string]$SevenZipPath = "C:\Program Files\7-Zip\7z.exe"
)
# Get all archive files
if (!$ArchivePath) { return Write-Warning "Archives path not specified" }
$itemsArray = Get-ChildItem -Path "$ArchivePath\*" -Include *.7z, *.rar, *.zip | Select-Object -ExpandProperty FullName
if ($itemsArray.Count -eq 0) {
Write-Warning "No archive files found in $ArchivePath"
return
}
$7zArray = @()
# Get information for each archive using 7-Zip
try {
foreach ($item in $itemsArray) {
$7zArray += & "$SevenZipPath" l "$item"
}
}
catch {
Write-Warning "Failed to process archive: $item"
Write-Warning $_.Exception.Message
return
}
Write-Output "Number of archives found: $($itemsArray.count)"
# Extract uncompressed sizes from 7-Zip output
$pattern = '\.\.\.\.A\s+(\d+)\s+'
$sizeMatches = $7zArray | Where-Object { $_ -match $pattern }
$uncompSizesArr = @()
foreach ($item in $sizeMatches) {
if ($item -match $pattern) {
$uncompSizesArr += [long]$matches[1]
}
}
# Calculate and output total size
$totalUncompSize = ($uncompSizesArr | Measure-Object -Sum).Sum
$sizeInGB = [math]::Round(($totalUncompSize / 1GB), 2)
Write-Output "Total uncompressed size: $sizeInGB GB"
}
#Playstation #7zip #Powershell
❤3❤🔥1
Media is too big
VIEW IN TELEGRAM
Как и все, я часто покупаю что-то на маркетплейсах, так как удобство похода в ПВЗ около дома затмевает все мнимые преимущества похода в магазин.
И если в обычном магазине я начинаю кряхтеть, когда меняют местами отделы с продуктами, когда я только запомнил где находится кола и шоколадки, то в случае с онлайн-магазинами я начинаю кряхтеть, когда из-за абсолютно упоротого UI\UX я три часа не могу найти кнопку, которая, казалось бы, должна быть на самом видном месте.
И сегодня я предлагаю вместе посмотреть на бешеный UX, который выдает WildBerries.
На мой скромный взгляд, простота пользовательского маршрута говорит о заботе о пользователе. Чем проще добраться до ключевых для него кнопок, чем больше ясно, что UX разрабатывается именно для пользователя, а не против него.
И если я, человек, который почти 10 лет уже работает в ИТ, испытываю трудности с поиском кнопки отмены подписки, то что же испытают люди, который едва умеют пользоваться смартфонами?
В общем, на коротком видео в UI представлены две кнопки, открывающие всплывающее окно управления подпиской. Но ни в одной из них нет кнопки "отменить подписку". Конечно, первый импульс - написать в поддержку, но мне часто интересно докопаться до сути и я начал слишком дотошно клацать по интерфейсу, чтобы всё-таки понять, как ее отключить.
Как оказалось, та самая кнопка находится в разделе Вопросы и ответы. Любопытно, как спрятано. Это получается уже третья кнопка на странице, которая открывает Управление подпиской, но только в ней есть кнопка Отменить.
Как на ваш взгляд, это про пользователя?)
#ux #wildberries
И если в обычном магазине я начинаю кряхтеть, когда меняют местами отделы с продуктами, когда я только запомнил где находится кола и шоколадки, то в случае с онлайн-магазинами я начинаю кряхтеть, когда из-за абсолютно упоротого UI\UX я три часа не могу найти кнопку, которая, казалось бы, должна быть на самом видном месте.
И сегодня я предлагаю вместе посмотреть на бешеный UX, который выдает WildBerries.
На мой скромный взгляд, простота пользовательского маршрута говорит о заботе о пользователе. Чем проще добраться до ключевых для него кнопок, чем больше ясно, что UX разрабатывается именно для пользователя, а не против него.
И если я, человек, который почти 10 лет уже работает в ИТ, испытываю трудности с поиском кнопки отмены подписки, то что же испытают люди, который едва умеют пользоваться смартфонами?
В общем, на коротком видео в UI представлены две кнопки, открывающие всплывающее окно управления подпиской. Но ни в одной из них нет кнопки "отменить подписку". Конечно, первый импульс - написать в поддержку, но мне часто интересно докопаться до сути и я начал слишком дотошно клацать по интерфейсу, чтобы всё-таки понять, как ее отключить.
Как оказалось, та самая кнопка находится в разделе Вопросы и ответы. Любопытно, как спрятано. Это получается уже третья кнопка на странице, которая открывает Управление подпиской, но только в ней есть кнопка Отменить.
Как на ваш взгляд, это про пользователя?)
#ux #wildberries
❤1❤🔥1🔥1
Технические заметки
Как и все, я часто покупаю что-то на маркетплейсах, так как удобство похода в ПВЗ около дома затмевает все мнимые преимущества похода в магазин. И если в обычном магазине я начинаю кряхтеть, когда меняют местами отделы с продуктами, когда я только запомнил…
В дополнение к прошлому посту. Прикольно, что на телефоне вообще нельзя отменить подписку.
#ux #wildberries
#ux #wildberries
🔥2
Технические заметки
В дополнение к прошлому посту. Прикольно, что на телефоне вообще нельзя отменить подписку. #ux #wildberries
This media is not supported in your browser
VIEW IN TELEGRAM
Завершаю посты про Вайлдберрис. Давайте вместе посмотрим как происходит отмена подписки.
Мы уже знаем, что отменить подписку можно только из раздела Вопросы и ответы. Вероятно, у фронтенд-разработчиков есть KPI на количество кликов и скролла на странице 😀
Но если серьезно, то суммарно весь этот опыт пользователя - максимально кошмарный. Весь UX кричит о том, что вас не хотят отпускать, лишь бы вы продолжали тратить деньги. Лично у меня это вызывает дискомфорт. Очень агрессивное удержание клиента, как по мне.
Неприятная обратная сторона эпохи маркетплейсов.
#ux #wildberries
Мы уже знаем, что отменить подписку можно только из раздела Вопросы и ответы. Вероятно, у фронтенд-разработчиков есть KPI на количество кликов и скролла на странице 😀
Но если серьезно, то суммарно весь этот опыт пользователя - максимально кошмарный. Весь UX кричит о том, что вас не хотят отпускать, лишь бы вы продолжали тратить деньги. Лично у меня это вызывает дискомфорт. Очень агрессивное удержание клиента, как по мне.
Неприятная обратная сторона эпохи маркетплейсов.
#ux #wildberries
👍2🔥2❤🔥1
В своё время для меня стал открытием тот факт, что метод fetch в JavaScript не кидает исключения на 400-х и 500-х ошибках, так как по сути, это всё валидные ответы сервера, и нам, разработчикам, решать, как эти ошибки обрабатывать.
Для моего неокрепшего ума начинающего веб-разработчика было малопостижимо, что ошибка 404 ошибкой самой по себе не является и это моя задача проверить статус запроса и соответствующе отреагировать. Лично по моему скромному мнению, обработка ошибок - одна из самых нудных задач в разработке, потому самому обрабатывать такую банальщину, как 400-е ответы, кажется уж совсем не современно.
Да, конечно, вы можете справедливо мне посоветовать Axios, TanStack или RTK Query и будете правы, но когда сам по себе проект является очень маленьким, почти домашним, тащить туда целую библиотеку для запросов кажется избыточным, потому было грустно осознавать, что придется все оборачивать в try\catch.
Однако, поковырявшись в интернетах я набрел на вот такую либу: ky.
По сути, это обёртка над fetch, но с упрощенным синтаксисом и очень широким списком фичей, в виде автоматических повторов запросов, автоматического парсинга JSON, понятных исключений при 400-х и 500-х ошибках и много еще чего другого.
Одна из примечательных возможностей библиотеки, после понятных сообщений при http-ошибках, это модификация тела запроса в определенных условиях. Например, я использовал ky, чтобы обновлять токен, когда он истекает, что делает создание цикла авторизации очень удобным.
Происходит запрос => Токен истек => Запрос рефреш-токена => повторный запрос.
Я наткнулся на этот инструмент, когда изучал JWT-токены. Пытаясь реализовать сценарий работы с ними, мне не понравился подход с Interceptors в Axios. Очень уж громоздко.
#javascript #React #dx
В методе fetch() promise будет отклонён (reject) с TypeError, когда случится ошибка сети или не будет сконфигурирован CORS на стороне запрашиваемого сервера, хотя обычно это означает проблемы доступа или аналогичные — для примера, 404 не является сетевой ошибкой. Для достоверной проверки успешности fetch() будет включать проверку того, что promise успешен (resolved), затем проверку того, что значение свойства Response.ok является true.
Для моего неокрепшего ума начинающего веб-разработчика было малопостижимо, что ошибка 404 ошибкой самой по себе не является и это моя задача проверить статус запроса и соответствующе отреагировать. Лично по моему скромному мнению, обработка ошибок - одна из самых нудных задач в разработке, потому самому обрабатывать такую банальщину, как 400-е ответы, кажется уж совсем не современно.
Да, конечно, вы можете справедливо мне посоветовать Axios, TanStack или RTK Query и будете правы, но когда сам по себе проект является очень маленьким, почти домашним, тащить туда целую библиотеку для запросов кажется избыточным, потому было грустно осознавать, что придется все оборачивать в try\catch.
Однако, поковырявшись в интернетах я набрел на вот такую либу: ky.
По сути, это обёртка над fetch, но с упрощенным синтаксисом и очень широким списком фичей, в виде автоматических повторов запросов, автоматического парсинга JSON, понятных исключений при 400-х и 500-х ошибках и много еще чего другого.
Одна из примечательных возможностей библиотеки, после понятных сообщений при http-ошибках, это модификация тела запроса в определенных условиях. Например, я использовал ky, чтобы обновлять токен, когда он истекает, что делает создание цикла авторизации очень удобным.
Происходит запрос => Токен истек => Запрос рефреш-токена => повторный запрос.
ky.extend({
hooks: {
afterResponse: [
async (request, options, response) => {
if (response.status === 401) {
const newToken = await refreshAuthToken();
request.headers.set('Authorization', `Bearer ${newToken}`);
return ky(request);
}
}
]
}
});Я наткнулся на этот инструмент, когда изучал JWT-токены. Пытаясь реализовать сценарий работы с ними, мне не понравился подход с Interceptors в Axios. Очень уж громоздко.
#javascript #React #dx
❤🔥1❤1🔥1