Вызов Base64!

Когда я начинал этот проект, возник вопрос о том, как я буду принимать изображения. В описании проекта одним из вариантов было принять их в виде строк base64. Это заинтриговало меня, потому что я слышал об этой технике ранее в другой работе, но лично никогда не использовал ее. Поэтому я решил, что буду использовать именно этот подход и узнаю много нового!

Это оказалось самым большим препятствием в реализации проекта на начальном этапе.

Главным неизвестным для меня было декодирование изображения в формате base64 и возможность работы с ним. Я быстро взял случайное изображение и отнес его на сайт, чтобы закодировать в base64. То, что я получил в ответ, выглядело для меня как тарабарщина или, возможно, даже как код Matrix. В лучшем случае я распознал «data:image/png…» в первой части строки, а все остальное могло быть написано на японском языке. И она была длинной… чрезвычайно, пугающе длинной…

Мои первоначальные поиски привели меня по кругу. Обсуждалась загрузка изображений в формате base64, но ничего конкретного, с чем можно было бы работать, не было. Поначалу это довольно обескураживало и несколько раз заставляло меня откладывать проект на потом. В это время я обращался за помощью к окружающим. В основном я обращался в Twitter и к нескольким друзьям Backend, которых я знал и которые могли бы мне помочь. К сожалению, я не получил от них ответа и просто продолжал заниматься этим в одиночку.

Затем я наткнулся на этот пример (респект Панкаджу Кумару):

https://jsonworld.com/demo/nodejs-sample-application

В приведенном выше примере сервер узла принимает образ base64 и декодирует его перед записью на диск. Он проверяет, что это строка base64, используя отказ, который проверяет наличие двух элементов в строке, ‘data:’ и ‘base64,’. Затем он сохраняет следующий текст, который вы можете использовать при декодировании. Я не могу с гордостью сказать об этом, но изначально я проделал всю эту работу. Я мало что знал о буферах и о том, как их использовать, и уж точно не знал, как использовать их для декодирования данных base64. Хотя я пытался понять, что означает код, я потратил так много времени, не добившись никакого прогресса, что просто хотел продолжить проект, а не тратить время на то, чтобы не двигаться вперед. Тем не менее, я внес несколько изменений в приведенный выше пример.

Мне было важно, чтобы у меня были служебные функции, которые я мог бы вызывать каждый раз, когда мне нужно декодировать изображение base64, поэтому я потратил некоторое время на структурирование кода, чтобы было легко найти то, что мне нужно. Сначала я написал файл prepare base64 img, который принимал необработанную строку base64, передавал ее и все, что возвращали эти утилиты, прежде чем выдать окончательный результат. Одна утилита извлекала из строки необходимые фрагменты, помещала их в массивы Regex и возвращала их. Другая утилита фактически выполняла декодирование и запись на диск. Я позаботился о том, чтобы хранить Regex в отдельном файле, чтобы его было легко найти и легко изменить в случае необходимости (честно говоря, я не менял его с момента использования).

Одной из самых больших проблем при таком подходе была запись файлов на диск. Это было очень знакомо мне по работе над другими проектами Backend, поэтому я быстро привык работать с таким подходом. Проблема возникает из-за неблокирующего ввода-вывода Node.js и того факта, что вы записываете и читаете с диска, что очень медленно по сравнению с другими подходами. При работе с файловой системой, из-за асинхронной природы JavaScript, очень легко попытаться записать файл в файловую систему, а затем попытаться использовать этот файл позже в вашем приложении и обнаружить, что там нет ничего, что можно использовать. Это можно решить, используя writefilesync из пакета fs, но, как я узнал позже, это не самая лучшая практика, потому что вы хотите воспользоваться преимуществом того, что JavaScript может продолжать работу вашего приложения во время записи файлов на диск, а не задерживать всю систему. В то время мне это не пришло в голову, но, честно говоря, это было неважно, потому что я делал успехи, и это все, что имело значение. Я победил образы base64, и хотя я был в синяках, я не был остановлен. Я был просто счастлив, что смог успешно реализовать декодирование base64.

Изначально я возвращал необработанное изображение в ответе сервера, но когда я попросил высказать мнение о моей работе, мне сказали, что лучше было бы передать его в виде строки base64, поскольку именно этого, скорее всего, ожидает пользователь. Кодирование изображения оказалось значительно менее сложной задачей, и потребовалось всего несколько поисков в Google, прежде чем я нашел решение. Оно включало чтение файла изображения с диска в формате base64, а затем добавление других необходимых частей строки base64 перед передачей контроллеру и последующей отправкой ответа.

Вот коммит, когда я закончил начальную проверку Base64: https://github.com/chadstewart/you-go-backend-project/commit/3d796eac0406d4fa63c9f54888df010331a7414c.

В следующей статье этой серии я рассмотрю валидацию запросов.

Оцените статью
Procodings.ru
Добавить комментарий