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

Базовый контроллер

Удобно иметь общие методы для контроллеров модуля собранными в единственном классе. В админке в этой роли выступает базовый контроллер, описываемый в файле modules/admin/components/Controller.js. Остальные контроллеры модуля наследуются от него прямо и косвенно.

Директория components внутри модуля (приложения) используется для размещения различных дополнительных классов, использующихся моделями, контроллерами или представлениями.

modules/admin/components/Controller.js

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

Статический метод isValidId проверяет корректность идентификатора объекта.

modules/admin/components/Controller.js

...
static isValidId (id) {
  return id && /^[a-f0-9]{24}$/.test(id);
}
...

Метод getModel ищет объект по переданному в GET-параметре идентификатору. Метод getModelClass возвращает класс модели. Найденная модель будет загружена вместе с отношениями, указаными в массиве relations. Если модель не найдена, то происходит возврат 404 ошибки.

modules/admin/components/Controller.js

...
getModel (cb, ...relations) {
  let id = this.getQueryParam('id');
  if (this.constructor.isValidId(id)) {
    this.getModelClass().findById(id).with(relations).one((err, model)=> {
      err ? this.throwError(err)
          : model ? cb(model) : this.throwNotFound();
    });
  } else this.throwNotFound();
}
...

Метод getRefUrl возвращает адрес предыдущей страницы. Адрес извлекается из заголовка запроса или POST-параметра.

modules/admin/components/Controller.js

...
getRefUrl () {
  let ref = this.isGet() ? this.getHeader('referrer') : this.getBodyParam('referrer');
  return ref ? ref : '';
}
...

Метод backToRef переадресует текущий запрос на адрес, полученный из POST запроса или аргумента url.

modules/admin/components/Controller.js

...
backToRef (url = 'index') {
  let ref = this.getBodyParam('referrer');
  this.redirect(ref || url);
}
...