Путь до джуна
89 subscribers
206 photos
94 videos
2 files
37 links
Для связи @nesmoru
Download Telegram
Пытаюсь связаться с апишкой (exchangerate-api), с сервера приходит код 200, значит запрос выполнен успешно, но при преобразовании в json выдаёт ошибку

Unexpected token '<', "<!doctype "... is not valid JSON

    Для сравнения: ответ который я должен получить находится на первом фото, но получаю я совершенно другой(находится на втором фото). Все методы перепробовал - ключ правильный, URL тоже.
   DeepSeek утверждает, что проблема либо в ключе и URL, либо сервер не отвечает, либо блокирует запрос. Но странно, что статус запроса при этом 200.
  Проект фактически сделан, но апишка всё портит.

P.S Код файла в комментариях или по ссылке: http://github.com/Holman52/crypto/blob/main/src/utils/useConvertRate.jsx
👀2🔥1🤮1
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 130
Разработал простенький конвертор валют. Пользователь вводит число и необходимые валюты, затем получает результат курса. Были проблемы с апишкой, так как первый раз в реакте использовал апишку, засунул .env с ключом в SRC, тем самым получал значение undefined при попытке получить коэффициент конвертации.
Весь проект стоит оптимизировать, чтобы компоненты не рендерились повторно из-за мелких изменений.
Также перешёл на vite, очень удобный инструмент сборки. Было неудобно создавать проект при create-react-app, так как при написании верстки приходилось перезапускать сервер. Стоит отметить, что очень у vite простая и быстрая настройка для создания проекта.
🔥4👏1💩1
Верстаю на gulp эту и следующую неделю.
Потом расскажу подробно, что было сделано
🤔5
🔧 Всю неделю делал вёрстку через gulp по макету: 📎 https://www.figma.com/design/YzuOcBWGO4pOCW7O3I3KOw/eCommerce_Website_Web_Page_Design_UI_KIT_Interior_Landing_Page_Community?node-id=0-1&t=xnXgLPxzXbYe5Xxi-1

Прикольная штука для автоматизации рутинных задач по вёрстке. 🔨 Перед началом работы нужно установить огромное количество пакетов + настроить всё через конфиг.

⚙️ Конфиг включает:
- Автоматическую конвертацию изображений в webp
- Ресайз изображений под разные устройства
- Компиляцию SCSS → CSS (писал на SCSS)

🔄 В Gulp используется похожая на React логика компонентов, но с другим синтаксисом:
- Вставка: @@include (Gulp) vs JSX (React)
- Данные: @@переменные (Gulp) vs props (React)

📸 Примеры:
- Компонент на React
- Компонент на Gulp
- Вставка в HTML

Вёрстка немного кривая, на айфоне текст может съехать
🚀 Результат: 📎 https://holman52.github.io/host-gulp/

Как такого JS нет, только на открытие корзины
🔥6
ДЕНЬ 131
Устанавливал PHP на комп, изначально хотел через XAMPP (так как там не нужно настраивать вручную и куда проще скачать), но мне не удалось даже начать загрузку, поэтому устанавливал вручную:
- PHP
- Apache
+ Делал настройку под PostgreSQL

Изначально установил не ту версию PHP, которая не предназначена под Apache, из-за этого пришлось переустанавливать на другую версию.

Прописал одну команду в тестовый файл PHP и запустил локалку → получил вывод инфы о PHP → следовательно всё работает.

Вчера смотрел про оптимизацию в React и добавил:
- useCallback
- memo
в компоненты.
❤2🔥2🎅1
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 132
PHP установлен, осталось только подключить его к проекту. Изначально я пытался сделать так, чтобы в одном проекте находились и фронтенд, и бэкенд. Я настраивал конфигурацию Apache, чтобы он запускал файлы PHP на локалке не только из своей папки, но и из проекта, но так и не смог это сделать. Поэтому в папке htdocs (откуда запускаются файлы PHP на локалке) я создал еще одну папку для проекта и оттуда уже запускал PHP.

Так как сервер и фронтенд находятся на разных портах, их нужно было как-то связать. В запросе я указывал localhost:80 (80 — порт моего сервера), но при отправке он уходил на localhost:5173 (5173 — порт для фронтенда) и на localhost:80. Чтобы это исправить, нужно было немного изменить конфигурацию Vite для сервера. После этого запрос обрабатывался корректно и выводил результат, который написан на PHP.

На PHP был написан простенький код для чтения файла и вывода его содержимого.

При нажатии на кнопку содержимое файла выводится к консоль
🙉2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 133
    Для практики с PHP решил сделать дефолтный таск-менеджер с подключением базы данных.

Когда создаешь задачу — форма отправляется и данные заносятся в БД. Также сделал отображение задач из базы на сайт, но есть нюансы:

1️⃣ При отправке формы перекидывает на страницу с PHP-файлом. Пытался это пофиксить, убирая дефолтное поведение браузера при отправке формы, но в этом случае данные не заносятся в БД.

2️⃣ Данные из БД отображаются не динамически — нужно перезагружать страницу. Можно пофиксить, задав интервал рендера компонента, но, думаю, лучше использовать вебсокеты.

Также всё это дело нужно стилизовать и довести до ума, разумеется.
🔥4👨‍💻1
ДЕНЬ 134
Пытался всю ночь сделать отправку формы без перезагрузки страницы, но не получилось. На бэкенд отправляется два запроса:

-До проверки на PHP (что приходит POST-запрос) – в сети было два ответа: один с ошибкой, другой успешный.
-Данные с формы передаются (всё проверял в консоли).

Скорее всего, из-за неуспешного первого запроса данные не заносятся в БД.

После добавления проверки (фото 1) на отправку POST-запроса приходят два ответа с ошибкой 405, хотя фронт отправляет запрос с методом POST ( фото 2)
❤2👨‍💻1
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 135
Нашел, в чем была ошибка запросов. В заголовках при отправке с фронта стоял Content-Type, и на бэке тоже. Соответственно, запрос отправлялся дважды. Я пофиксил это, убрав Content-Type при отправке запроса в React.

Также стилизовал отображение данных на странице с возможностью удаления и редактирования (но пока такого функционала нет).
❤2🤷‍♂1🔥1
IMG_20250711_170657_871.png
6.6 KB
ДЕНЬ 136
Очередная проблема с серверной частью.

Я пытался реализовать удаление задачи при клике на иконку, но сервер не обрабатывает запрос. ID задачи передаётся корректно, однако запрос приходит не как 'DELETE', что вызывает ошибку. Я пробовал отправить прямой запрос на удаление, но сервер его не распознаёт. Также использовал метод POST с переменной для удаления, а также отправлял запросы через axios, но результат остаётся неизменным: два ответа, и оба неудачные.

Путь к файлу PHP проверен и правильный.
❤1🔥1🍌1
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 137

Наконец-то я понял, в чем был нюанс. Я перепробовал разные методы запросов и способы их отправки. В итоге нашел причину проблемы.

Изначально было два неправильных запроса. В первом случае необходимо было настроить CORS, чтобы разрешить доступ с определенного домена для выполнения запроса. Во втором случае ошибка возникла на стороне бэкенда из-за неправильного синтаксиса SQL-запроса к базе данных.

Теперь я понимаю, что нормально, когда сервер отправляет два запроса: предварительный и основной. Предварительный запрос выполняется методом OPTIONS и проверяет, разрешает ли сервер выполнение основного запроса. После этого браузер отправляет запрос на сервер с информацией о методе и заголовках, которые будут использованы в основном запросе.

Чтобы основной скрипт сработал и удалил задачу из базы данных, нужно добавить следующую команду:

if ($method === 'OPTIONS') {
    exit;
}
🔥3🥰1👨‍💻1
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 138

Внёс изменение данных в таске (название и степень важности). Можно либо применить изменение, либо отменить и оставить как было. Принцип прост: при клике на изменение, в ячейки таблицы добавляется input (для ввода двух значений) .

Осталась самая сложная часть — реализовать вебсокет для отслеживания изменений. Разбирался, для чего он нужен и в каких случаях используется. Хочется максимально подробно изучить их, чтобы потом не возникало особых проблем. Кто уже писал вебсокеты — есть ли смысл делать их на PHP или лучше на Node.js?
🔥2🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 139

Переписал все запросы на context, так как мне это показалось намного удобнее. Теперь нет огромного кода с запросом в компоненте — все они хранятся отдельно и просто берутся с помощью useContext. После этого все действия на странице отображаются сразу же (добавление, удаление, редактирование).

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

P.S. Контента долго не было, так как постоянно был в разъездах и крайне мало находился в городе.
👨‍💻3
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 140

Пытаюсь сделать вебсокет для динамического обмена тасками между пользователями (в моём случае — вкладками или браузерами).

Плотно изучал их, всевозможные видео посмотрел по вебсокетам, у нейронки разбор просил несколько раз. Изначально делал максимально примитивно: один серверный файл и связь в компоненте. Но не всё так просто: отправка сообщения должна быть с формы, а отображение таски — в другом компоненте. Так как у задач есть свойство удаляться и редактироваться, это не рентабельно, поэтому пришла идея создать контекст с вебсокетом, где будут все функции для тасок (создание, редактирование, удаление).

Столкнулся с проблемой: когда страница рендерится, сначала рендерится компонент с вызовом функции для получения всех тасок из базы, который находится в контексте. Мне же нужно, чтобы эта функция запускалась при открытии вебсокета. НО вебсокет — на контексте, и все функции с базой тоже в контексте, соответственно они конфликтуют, и ничего не выходит.
🔥2
Есть вариант попробовать вынести все функции с базой отдельно — должно прокатить.

Как таковой вебсокет получился: новая таска передаётся, и всё нормально, но пока не отображается у другого пользователя.
🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
ДЕНЬ 141

   Вынес все функции с базой и вебсокетом в отдельные файлы, чтобы избежать конфликтов и это у меня получилось(отчасти). Очень тупил с диспатчем для обращения к базе, пытался в отдельном файле с запросами к БД сделать, но спустя некоторое время понял, что это максимально тупо и вот тут мне впервые пригодился метод .then для асинхронной операции, чтобы передать результат в вебсокет. Также столкнулся с ошибкой, связанной с назначением айдшника, но об этом в видео.
🔥2⚡1
Также пробовал писать бэк на C#, но об этом чуть позже
👍1🔥1
Оговорился: у некоторых полей не Not Null, а просто Null. Особо не стилизовал, так как упор был именно на бэкенд. Прикреплю скриншот схемы из базы данных.
Было очень удобно писать бэкенд тем, что всё пишется в одном проекте — и бэкенд, и фронтенд. За счёт Entity Framework SQL-запросы пишутся по-другому (третье фото), что очень удобно.

В проекте с задачами теперь все данные передаются правильно, но не рендерятся. Нужно связывать два контекста между собой, чтобы данные, которые изменил один пользователь, отображались у другого — необходимо сделать обработку этих данных в другом контексте. Либо попробовать закинуть всё в один контекст, как мне кажется, это наиболее подходящий вариант.
🔥3