2015-10-05 2 views
10

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

Чтобы избежать необходимости записывать данные об ошибке, я хочу просто передать функцию 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(); 
    } 
}); 

EDIT: Удалить переменными

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(); 
    } 
}); 
+0

Могу ли я спросить, почему вы хотите, чтобы метод authorize обрабатывал вызов 'next'? Какая ситуация была бы полезной? – shennan

ответ

4

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

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

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

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

+0

Хм, я не уверен, если 'next' - это еще одна функция. Он должен каким-то образом иметь информацию о текущем запросе, чтобы не мешать другим запросам. Например, если я называю «следующий», он должен знать, что такое «следующий». Таким образом, есть некоторые данные, которые необходимо сохранить для каждого запроса, я думаю. – Rob

+1

Существует некоторый «невидимый» код, добавленный Express, который передает 'req',' res' и т. Д. Через. Последовательность обработчиков определяется порядком, в котором вы вызывали вызов '.use()', это похоже на добавление обратных вызовов к последовательности трубопроводов. В какой-то момент каждый вызов промежуточного программного обеспечения должен завершиться, и те объекты, на которые ссылаются, потеряют свои ссылки и получат сбор мусора; даже если вы ссылаетесь на них в «следующем» промежуточном программном обеспечении, в какой-то момент следующая функция также должна заканчиваться. –

Смежные вопросы