У меня есть простое приложение NodeJS 12.3.1 + Express 4.17.1 + PM2. Я создал себе некоторую MVC-подобную структуру, но сегодня наткнулся на вопрос об архитектуре, который связан с управлением памятью в NodeJS / PM2.
Скажем, у нас есть простое приложение с двумя конечными точками - /login
и/register
.
Первой моей идеей было создание controller
, которое принимает объекты Express req, res и next, а также другие необходимые параметры в constructor
. Простой пример ниже. Это подход, который мы сейчас используем в нашем приложении.
// src/controllers/UserController.js
class UserController {
constructor(config, req, res, next) {
this.req = req;
this.res = res;
this.next = next;
}
loginAction() {
this.res.send('Hello world!');
}
registerAction() {
this.res.send('Hello world!');
}
}
// src/routes/UserRoutes.js
class UserRoutes {
constructor(config, router) {
this.router = router;
this.config = config;
}
registerRoutes() {
const that = this;
this.router.get('/login', function (req, res, next) {
const controller = new UserController(that.config, req, res, next);
controller.loginAction();
});
this.router.post('/register', function (req, res, next) {
const controller = new UserController(that.config, req, res, next);
controller.registerAction();
});
}
}
// src/core/Bootstrap.js
class Bootstrap {
initRouting() {
const userRoutes = new UserRoutes(this.config, this.expressRouter);
userRoutes.registerRoutes();
}
}
// src/app.js
const Bootstrap = new Bootstrap();
Bootstrap.initRouting();
Но я думал о том, чтобы сделать действия более разделенными, чтобы они не становились такими жирными и не модифицировали реальный объект контроллера. Я думал о достижении этого с помощью кода, представленного ниже.
// src/controllers/UserController.js
class UserController {
loginAction(req, res, next) {
res.send('Hello world!');
}
registerAction(req, res, next) {
res.send('Hello world!');
}
}
// src/routes/UserRoutes.js
class UserRoutes {
constructor(config, router) {
this.router = router;
this.config = config;
}
registerRoutes() {
const controller = new UserController(this.config);
this.router.get('/login', function (req, res, next) {
controller.loginAction(req, res, next);
});
this.router.post('/register', function (req, res, next) {
controller.registerAction(req, res, next);
});
}
}
Мне кажется, что второй подход лучше и чище. Нам не нужно беспокоиться о каком-либо другом действии / методе запроса или ответа. Все будет заключено в это одно действие, которое было названо (loginAction
или registerAction
). Но ... имеет ли смысл модифицировать нашу кодовую базу с любой другой точки зрения, чем чистить кодовую базу?
Я вижу, что мы создаем только один UserController
объект и передаем ему конфигурацию только один раз. Кроме того, req, res, next
не сохраняются в UserController
объекте - только передаются как параметры. Это что-то меняет? Будет ли приложение использовать меньше памяти? С каким подходом вы бы пошли и почему?