Санация и проверка введенного пользователем 10-значного телефонного номера

phoneNumberCheck () использует 2 вспомогательные функции для проверки правильности введенного пользователем номера телефона.

  1. это проверка на стороне клиента, если этот код в порядке, следует ли мне проверять то же самое на бэкэнде nodeJS?

  2. разделяет функцию проверки номера для проверки длины и другую функцию для проверки префикса, которую считают чрезмерной?

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

Спасибо,

// phone number input sanitizing
const sanitizeNumber = (phoneNumber) => {
  return phoneNumber
  .split('')
  .map((e) => e.replace(/D/g, ''))
  .join('')
}

// phone number validation: length and prefix
const validateNumber = (sanitizedInput) => {
  return sanitizedInput.length != 10 ? 'bad number length' :
  sanitizedInput.startsWith('05') ? sanitizedInput : 'bad number prefix'
}

/* high level function to check phone number validity,
returns valid number or error. */
const phoneNumberCheck = (userInput) => {
  // exit early if length is not correct (long strings)
  if (userInput.length === 10) {
    // sanitize
    const sanitizedNumber = sanitizeNumber(userInput)
    // validate
    return validateNumber(sanitizedNumber)
  }
  // implict else to return false
  return false
}

/* my test cases */

// returns false early
console.log(phoneNumberCheck(`.05'@0"12-34'5"67`))

// returns length error
console.log(phoneNumberCheck(`0501234-67`))

// returns prefix error
console.log(phoneNumberCheck(`0601234567`))
```

1 ответ
1

это проверка на стороне клиента, если этот код в порядке, следует ли мне проверять то же самое на бэкэнде nodeJS?

Да! Сервер не знает, что В самом деле работает на другой стороне соединения — все, что он знает, — это то, какие данные он получает. Возможно, он обращается к старой версии клиента, у которой была ошибка в коде проверки. Возможно, он обращается к стороннему клиенту, который думает, что вы используете другой формат, поэтому он что-то отправляет думает приемлемо, но на самом деле нет. Может быть, он разговаривает с подделка клиент, который хочет чтобы по какой-то причине поместить в вашу базу некорректные данные. Сетевой ввод Вход и к нему нужно относиться как любой другой ввод — делать нет предположения, которые вы не проверяете.

разделяет функцию проверки номера для проверки длины и другую функцию для проверки префикса, рассматриваемую как чрезмерную разработку?

Две простые функции обычно лучше, чем одна сложная функция, но одна простая функция часто лучше, чем две простые функции. Так что в общем нет, что мог быть действенным способом организовать это, если у вас были более сложные правила проверки. Но в этом случае я бы сказал да.

По этому поводу у меня есть мнение о вашей санитарной функции в целом:

  • Во-первых, joining и splitting здесь не нужен. Вы можете сделать то же самое с phoneNumber.replaceAll(/D/g, '')
  • Но главное — что полезный что делает эта функция? Когда я звоню sanitizeNumber Я не получаю дезинфицированный номер телефона — я получаю дезинфицированный что-нибудь и должен проверять будь то номер телефона. Это не кажется очень полезным. Почему я должен сам это проверять? У меня уже есть функция, которая утверждает, что превращает строку в номер телефона, почему она может этого не сделать и не говори мне? Разве это не должно вызывать исключение или возвращать null или что-то при вводе не может превратиться в действующий номер телефона?
  • Наконец, то, как написан ваш код, каждый раз, когда санация действительно заканчивается происходит он либо меняет недопустимый номер на другой недопустимый номер (10 символов, включая x нецифровых -> 10-x цифр, что слишком коротко, чтобы быть действительным), либо он оставляет ввод неизменным (не 10 символов -> без санитарии; 10 цифр -> без изменений). В этот момент что вы вообще дезинфицируете? Либо вход уже был действующий номер телефона или он превратился из недействительного номера телефона в по-прежнему является недействительным номером телефона — так почему бы просто не проверить, был ли введен действительный номер телефона в первую очередь? В этом случае это было бы так просто, как userInput.match(/^05d{8}$/)

Хотя я хочу отметить, что в зависимости от вашей целевой аудитории вы можете делать предположения о телефонных номерах, которых не должно быть. Ты Конечно номер телефона вашего пользователя будет из вашего региона? В противном случае проверка префикса может быть чрезмерной. Вы уверены, что у всех ваших пользователей будут номера телефонов из твоя страна (даже если они там живут)? В противном случае вы не должны принимать 10 цифр. Номера телефонов сложный, и вам может быть лучше найти библиотеку, которая уже справляется с этой сложностью, чем пытаться развернуть свою собственную реализацию.

  • Спасибо, Сара, этот код предназначен для определенных людей в конкретной стране и поставляется с инструкциями, поэтому я не пошел с библиотекой, которая обрабатывает телефонные номера в целом. как вы могли догадаться, это еще не производственный код: D, я буду реализовывать проверку на стороне сервера — одно из преимуществ использования JS в качестве внешнего интерфейса и внутреннего интерфейса — это практически одинаковый код: D. о функциях split UncleBob говорит extract (метод), а также извлекать и извлекать до тех пор, пока вы больше не сможете это делать. В этом случае, я думаю, подойдет одна простая функция.

    — хибих

  • sanitizeNumber Purpuse заключалась в том, чтобы удалить все символы sql-инъекций: `'» | etc’. Это отличный бэкэнд для: return userInput.match (/ ^ 05 d {8} $ /) == null? false: userInput. но. делая это на интерфейсе, у меня нет причины, по которой я могу вывести пользователю, что это за ошибка (отсутствующие цифры? / проверка префикса …).

    — хибих

  • @hibih: Если вы собираетесь убрать нецифровые символы, вы должны хотя бы это сделать перед вы проверяете длину, а не после. В противном случае пользователь может добавить ненужные символы к слишком короткому номеру, чтобы получить «действительный» номер, который на самом деле недействителен, но проходит вашу проверку.

    — Кевин

  • Заключительные моменты важны. Там, где я работаю (финансы), нам, как бизнесу, пришлось фактически определить, каким должен быть домашний телефонный номер, потому что номера мобильных телефонов в международном формате корректно подключаются к внутренним сетям и наоборот. Конечным результатом было любое число (с начальными нулями или без них, если длина была выше минимальной, то есть 7). Если человек был подключен к домашней сети, то не проблема, иначе нужно было организовать альтернативу.

    — Аарон

  • @Kevin все проверки запускаются вместе при нажатии кнопки.

    — хибих

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *