Управление памятью в NodeJS и PM2 - PullRequest
       15

Управление памятью в NodeJS и PM2

0 голосов
/ 30 сентября 2019

У меня есть простое приложение 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 объекте - только передаются как параметры. Это что-то меняет? Будет ли приложение использовать меньше памяти? С каким подходом вы бы пошли и почему?

...