Какая грустная история

Это реальная история, которая произошла со мной. В онлайн-проекте была серьезная ошибка, которая делала основную страницу непригодной для использования из-за неправильного использования JSON.stringify. Это серьезно повлияло на удобство работы пользователей, и я чуть не лишился годового бонуса.

В этой статье я поделюсь с вами историей, а затем мы также поговорим об особенностях JSON.stringify.

История

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

В это время в рабочей группе компании идет Острая дискуссия, и многие люди обсуждают этот вопрос:

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

Никто не знает, как решить проблему!

Никто не знает, как решить проблему!

Никто не знает, как решить проблему!

Когда я обнаружил, что коллеги жалуются на модуль, за который я отвечал, у меня разболелась голова😭.

После непродолжительного расследования я нашел причину бага.

Это так, есть форма, которая позволяет пользователям заполнять данные, а затем интерфейс должен анализировать данные и отправлять их на сервер.

Форма выглядит так (эти опции необязательны):

Обычно данные должны выглядеть так:

Затем он будет преобразован в это:

Однако все опции являются необязательными. Если пользователь не заполняет, данные выглядят так:

Затем он будет преобразован в это:

JSON.stringify игнорирует поля, значение которых не определено в процессе преобразования.

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

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

Первоначально это была страница, которая некоторое время находилась в сети. Почему вдруг появилась эта проблема, а раньше ее не было? После тщательных расспросов выяснилось, что продакт-менеджер упомянул небольшую точку оптимизации посередине. Я чувствовал, что дело было относительно небольшим, поэтому я изменил код и вышел в интернет, что в итоге привело к ошибкам в проекте.

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

Понимание JSON.stringify

Эта ошибка вызвана тем, что я не знаком с JSON.stringify, поэтому далее мы проанализируем некоторые возможности этой встроенной функции.

По сути, JSON.stringify преобразует объект в строку JSON.

В то же время JSON.stringify имеет следующие правила.

1. undefined, Function и Symbol не являются допустимыми значениями JSON. Если такие значения встречаются при преобразовании, они либо опускаются (при обнаружении в объекте), либо заменяются на null (при обнаружении в массиве). JSON.stringify() может возвращать undefined при передаче "чистых" значений, таких как JSON.stringify(function() {}) или JSON.stringify(undefined).

2. Объекты Boolean, Number и String преобразуются в соответствующие примитивные значения во время преобразования в строку в соответствии с традиционной семантикой преобразования.

3. Все свойства с ключом Symbol будут полностью игнорироваться, даже при использовании функции replacer.

4. Числа Infinity и NaN, а также значение null считаются null.

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

6. Экземпляры Date реализуют функцию toJSON(), возвращая строку (такую ​​же, как date.toISOString()). Таким образом, они рассматриваются как строки.

7. Выполнение этого метода для объекта, содержащего циклическую ссылку, вызовет ошибку.

8. Все остальные экземпляры Object (включая Map, Set, WeakMap и WeakSet) будут сериализованы только перечисляемыми свойствами.

9. Возникает ошибка при попытке преобразовать значение типа BigInt

Реализовать JSON.stringify самостоятельно

Лучший способ понять функцию — реализовать ее самостоятельно. Ниже я написал простую функцию, имитирующую JSON.stringify.

пройти тест

Окончательный

Из-за ошибки я заново изучил JSON.stringify и узнал, что в нем по-прежнему так много функций, которых я не замечал в обычное время.

Надеюсь, вы не совершите ту же ошибку в будущем.

Спасибо за прочтение.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.