Я играл с Sails, может быть, один день. Я пытаюсь понять, как лучше всего провести обширную проверку в Sails.js.
Вот сценарий:
Registration Form:
Username: _______________
E-Mail: _______________
Password: _______________
Confirm: _______________
Введенные пользователем данные:
- правильный адрес электронной почты
- имя пользователя, которое уже существует
- два пароля не совпадают
Желаемый результат:
Username: _______________ x Already taken
E-Mail: _______________ ✓
Password: _______________ ✓
Confirm: _______________ x Does not match
Требования, несколько ключевых моментов:
- Пользователь получает все сообщения об ошибках (а не только первое) для каждого аспекта своего ввода. Они не расплывчаты ("имя пользователя уже занято" или "имя пользователя должно состоять не менее чем из 4 букв" лучше, чем "недопустимое имя пользователя").
- Встроенная проверка модели, очевидно, не может отвечать за проверку подтверждения совпадающего пароля (SRP).
Что, по моему мнению, мне нужно сделать:
Пользовательский контроллер:
create: function(req, res) {
try {
// use a UserManager-Service to keep the controller nice and thin
UserManager.create(req.params.all(), function(user) {
res.send(user.toJSON());
});
}
catch (e) {
res.send(e);
}
}
Менеджер пользователей:
create: function(input, cb) {
UserValidator.validate(input); // this can throw a ValidationException which will then be handled by the controller
User.create(input, cb); // this line should only be reached if the UserValidator did not throw an exception
}
Пользователь: (модель)
attributes: {
username: {
type: 'string',
required: true,
minLength: 3,
unique: true
},
email: {
type: 'email',
required: true,
unique: true
},
password: {
type: 'string',
required: true
}
}
Пользователь Валидатор:
Это сложная часть. Мне нужно объединить проверку ввода (соответствует ли подтверждение пароля?) с проверкой модели (занято ли имя пользователя и действителен ли адрес электронной почты?).
Если бы был способ создать экземпляр модели пользователя и выполнить проверку без сохранения в базе данных в Sails/Waterline, я думаю, это было бы довольно просто, но, похоже, такой возможности нет.
Как бы вы подошли к решению этой проблемы? Большое спасибо за Вашу помощь!