Подтвердить что ты не робот

Node.js утечки памяти?

У меня есть код ниже, который я использую в своем приложении Express.js для централизации некоторой логики acl. Если функция возвращает true или false явно, промежуточное программное обеспечение может обрабатывать вызов next. Но если он не возвращает его в логику авторизации для выполнения next() всякий раз, когда он заканчивает делать это.

Чтобы избежать необходимости записывать данные об ошибках, я хочу просто передать функцию error(), которая может быть вызвана, которая просто вызывает внутреннюю функцию next.

Кто-то сказал мне, что это может привести к некоторым утечкам памяти, так как функция next находится в ее собственном закрытии и ссылается на нее извне. Я вижу, что подобные методы используются во многих примерах в Интернете, но я все еще новичок в Node.js, поэтому задаюсь вопросом, есть ли в этом правда?

this.router.use(function (req, res, next) {
    var err = {
            code: 403,
            exception: 'UnauthorizedException',
            data: {}
        },
        error = function () {
            next(err);
        },
        authorize = app.route.authorize(req, res, next, error);

    if (authorize === false) {
        next(err);
    }
    else if (authorize === true) {
        next();
    }
});

ИЗМЕНИТЬ: удалить переменные

this.router.use(function (req, res, next) {
    var authorize = app.route.authorize(req, res, next, function () {
        next({
            code: 403,
            exception: 'UnauthorizedException',
            data: {}
        });
    });

    if (authorize === false) {
        next({
            code: 403,
            exception: 'UnauthorizedException',
            data: {}
        });
    }
    else if (authorize === true) {
        next();
    }
});
4b9b3361

Ответ 1

Когда вы настраиваете промежуточное программное обеспечение, метод .use() вызывается там один раз, анонимный обработчик/промежуточное программное обеспечение записывается в память один раз, и это ту же самую функцию промежуточного программного обеспечения, которая вызывается для каждого нового запроса.

Переменная err создается каждый раз, когда выполняется промежуточное программное обеспечение, и это другой объект. Если бы вы поместили его за пределы и в область закрытия .use(), тогда он был бы тем же самым объектом.

Затем он передается в next, а next - это, скорее всего, другая промежуточная функция, которая получает экземпляр один раз и остается неизменной в памяти, которая сохраняется и захватывает доступ к закрытию.

Но тогда, когда функция next завершается, объект, на который указывает err, потеряет свои ссылки - он должен быть собран с помощью мусора.