phoneNumberCheck () использует 2 вспомогательные функции для проверки правильности введенного пользователем номера телефона.
это проверка на стороне клиента, если этот код в порядке, следует ли мне проверять то же самое на бэкэнде nodeJS?
разделяет функцию проверки номера для проверки длины и другую функцию для проверки префикса, которую считают чрезмерной?
Критические, необязательные и положительные отзывы более чем приветствуются.
Спасибо,
// 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 ответ
это проверка на стороне клиента, если этот код в порядке, следует ли мне проверять то же самое на бэкэнде nodeJS?
Да! Сервер не знает, что В самом деле работает на другой стороне соединения — все, что он знает, — это то, какие данные он получает. Возможно, он обращается к старой версии клиента, у которой была ошибка в коде проверки. Возможно, он обращается к стороннему клиенту, который думает, что вы используете другой формат, поэтому он что-то отправляет думает приемлемо, но на самом деле нет. Может быть, он разговаривает с подделка клиент, который хочет чтобы по какой-то причине поместить в вашу базу некорректные данные. Сетевой ввод Вход и к нему нужно относиться как любой другой ввод — делать нет предположения, которые вы не проверяете.
разделяет функцию проверки номера для проверки длины и другую функцию для проверки префикса, рассматриваемую как чрезмерную разработку?
Две простые функции обычно лучше, чем одна сложная функция, но одна простая функция часто лучше, чем две простые функции. Так что в общем нет, что мог быть действенным способом организовать это, если у вас были более сложные правила проверки. Но в этом случае я бы сказал да.
По этому поводу у меня есть мнение о вашей санитарной функции в целом:
- Во-первых,
join
ing иsplit
ting здесь не нужен. Вы можете сделать то же самое с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 все проверки запускаются вместе при нажатии кнопки.
— хибих
Показывать 2 больше комментариев