Как синхронизировать модели JS фреймфорка с моделями сервера?
Сразу оговорюсь - вопрос общий и неважно, какой фреймфорк используется (ни на сервере, ни на клиенте).
Проблема по пунктам:
- На сервере есть некоторые модели (таблицы, схемы, структуры) данных.
- Сервер предоставляет клиенту некоторый API для доступа к данным
- Каждая конечная точка в API сервера имеет свой набор полей, свои ограничения на чтение, запись, изменение данных
- Клиент должен подстраиваться под модели данных сервера при каждом изменении моделей или схемы данных на сервере
Вопрос:
Как вы обеспечиваете идентичность моделей клиента (с описанием полей, валидацией и прочим) с конечными точками сервера?
Пример:
Есть некоторое веб-приложение.
Приложение может:
- отображать список пользователей
- создавать новых пользователей
У пользователя есть набор атрибутов, в числе которых есть номер телефона и email.
При заполнении формы создания пользователя клиентская часть приложения должна проверять номер телефона и email на валидность, После отправки валидных данных на сервер для создания нового пользователя, сервер может ответить положительно или вернуть ошибку типа "Не уникальный email" или "Не уникальный номер телефона". Это нормальные ответы от сервера, и клиент должен их соответствующим образом обработать.
Сервер обязан валидировать данные. клиент в идеале тоже. Получается, что необходимо дважды описать валидацию для каждого поля (на сервере и на клиенте)? Никого это не смущает?
я храню правила валидации в модели и при отображении отправляю эти правила на клиента в json или в data атрибуты поля (в зависимости от шаблонизатора)
ну и написать функцию которая будет обрабатывать эти правила не сложно)
если нужно проверять поля на уникальность, то делать валидацию поля через сервер
Логично. Однако как быть в случае, если программист не использует в разработке node.js и фулл-стек фреймворки? Что если проект написан на Python, PHP, Erlang, или другом ЯП и своим фреймворком?
@kazhuravlev страдать:)
Есть несколько решений.
1) Некоторые фреймворки могут генерить формы и их элементы сразу с джаваскриптом, который будет валидировать (см. джанговские виджеты в админке).
2) Клиентская валидация отличается от серверной (иногда это имеет смысл), как правило она проще и проверяется только самое необходимое (заполненность полей).
3) Правила валидации пишутся на каком-то DSL, код клиентского валидатора либо генерируется, либо парсит этот DSL (примерно как описал @vitaliycto).