Строим блог на основе Node.js MVC фреймворка Areto

Форма регистрации

Для обработки данных форм используются классы моделей унаследованные от areto/base/Model.

models/SignUpForm.js

'use strict';
const Base = require('areto/base/Model');
module.exports = class SignUpForm extends Base {
    // place methods here
};
module.exports.init(module);
const User = require('./User');

Валидация модели

В массиве RULES описываются правила валидации модели. Каждый элемент массива - это отдельное правило, которое применяется к указанным в нем атрибутам модели. Само правило также представлено массивом, состоящим из нескольких элементов.

  • Первый элемент - это название атрибута, к которому применяется правило. Может быть строкой или массивом строк в случае нескольких атрибутов.
  • Второй элемент - это тип валидатора, который может быть внутренним валидатором фреймворка Areto, названием метода текущего класса или отдельным классом. Список встроенных валидаторов фреймворка: boolean, compare, date, email, exist, file, filter, image, number, range, regexp, required, string, unique, url.
  • Третий элемент необязательный. Это объект, в котором передаются параметры для правила.

Правила применяются в порядке следования элементов массива. По умолчанию, если атрибут не имеет значения или уже содержит ошибку из предыдущего правила, то его проверка пропускается. Изменить данное поведение можно через параметры правила skipOnError, skipOnAnyError, skipOnEmpty. Как пример в регистрации пользователя проверка на уникальность выбранного имени и email происходит только при отсутствии любых ошибок в предыдущих правилах.

models/SignUpForm.js

...
static getConstants () {
  return {
    RULES: [
      [['name', 'email', 'password', 'passwordRepeat', 'captchaCode'], 'required'],
      ['name', 'string', {min: 3, max: 24}],
      ['name', 'regexp', {pattern: /^[а-яa-z\s-]+$/i}],
      ['email', 'email'],
      ['captchaCode', require('areto/captcha/CaptchaValidator'), {
         CaptchaController: require('../controllers/AuthController')
      }],
      ['password', 'string', {min: 6, max: 24}],
      ['passwordRepeat', 'compare', {compareAttr: 'password'}],
      [['name', 'email'], 'unique', {
         skipOnAnyError: true,
         targetClass: User,
         ignoreCase: true
       }]
     ]
  };
}
...

Регистрация нового пользователя

Метод регистрации signUp проверяет данные, полученные с формы. Если ошибок нет, то создается модель пользователя User, инициализируется значениями формы и сохраняется в базе. После успешного сохранения текущая сессия привязывается к новому пользователю.

Форма регистрации пользователя

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

models/SignUpForm.js

...
signUp (webuser, cb) {
  this.validate(err => {
    if (err || this.hasError()) {
      cb(err);
    } else {
      let model = new User;
      model.assignAttrs(this);
      model.save(err => {
        if (model.hasError()) {
          this.addError('name', model.getFirstError());
          cb(err);
        } else {
          webuser.login(model, 0, cb);
        }
      });
    }
  })
}
...