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();
}
});
Ответы
Ответ 1
Когда вы настраиваете промежуточное программное обеспечение, метод .use()
вызывается там один раз, анонимный обработчик/промежуточное программное обеспечение записывается в память один раз, и это ту же самую функцию промежуточного программного обеспечения, которая вызывается для каждого нового запроса.
Переменная err
создается каждый раз, когда выполняется промежуточное программное обеспечение, и это другой объект. Если бы вы поместили его за пределы и в область закрытия .use()
, тогда он был бы тем же самым объектом.
Затем он передается в next
, а next
- это, скорее всего, другая промежуточная функция, которая получает экземпляр один раз и остается неизменной в памяти, которая сохраняется и захватывает доступ к закрытию.
Но тогда, когда функция next
завершается, объект, на который указывает err
, потеряет свои ссылки - он должен быть собран с помощью мусора.