Зачем приводить все значения объекта в строки в Javascript? - PullRequest
0 голосов
/ 25 апреля 2018

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

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

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

const mapValues = require('lodash/mapValues')
const escape = require('validator/lib/escape')
...
const body = mapValues(requestBody, value => escape('' + value))
...

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

Мои первые мысли это:

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

  • Недостаток: дополнительная сложность, связанная с нестроковыми значениями, такими как числа.

Q1: Есть ли другие преимущества и недостатки использования этого подхода?

Q2: Может ли это считаться плохой практикой? Если так, то почему? (факты, а не мнения, пожалуйста)

Заранее спасибо! :)

1 Ответ

0 голосов
/ 25 апреля 2018

Интересный вопрос.Я предлагаю вам спросить автора, доступны ли они.Вот некоторые из моих мыслей:

Я утверждаю, что строковые значения не уменьшают, а увеличивают когнитивную нагрузку, так как вы должны остерегаться преобразовывать их при выполнении базовой арифметики.Я уверен, что все мы, по крайней мере, однажды 1+1 были 11.

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

Единственная веская причина, которую я могу себе представить, - это предотвращение различных инъекционных атак на службу.В некоторых сценариях, если пользователю разрешено отправлять в произвольном формате json, возможно заставить службу выполнять пути кода, которые она обычно не делает.(что-то странное, например, {"__proto__":[],"length":1,"0":"foo"} совпадает с "foo", но является объектом типа typeof, это может обойти некоторую ошибочную логику проверки. mongodb также подвержен некоторым атакам).Но даже в этом случае правильная проверка будет намного лучше, чем преобразование каждого значения в строку.

...