Node.js 内存泄漏?
Posted
技术标签:
【中文标题】Node.js 内存泄漏?【英文标题】:Node.js memory leaks? 【发布时间】:2016-01-01 21:51:51 【问题描述】:下面有一些代码,我在我的 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();
);
【问题讨论】:
我能问一下您为什么要使用授权方法来处理next
调用吗?这在什么情况下有用?
【参考方案1】:
当您设置中间件时,.use()
方法在那里被调用一次,匿名处理程序/中间件被写入内存一次,每个新请求都会调用同一个中间件函数。
每次中间件运行时都会实例化err
变量,它是一个不同的对象。如果你把它放在.use()
的闭包范围之外,它就会是同一个对象。
然后将其传递给next
,next
很可能是另一个中间件函数,它被实例化一次并在内存中保持不变,并持续存在并获取其闭包访问权限。
但是,当next
函数完成运行时,err
指向的对象将丢失其引用——它应该被垃圾回收。
【讨论】:
嗯,我不确定next
是否只是另一个函数。它需要以某种方式获得有关当前请求的信息,以免干扰其他请求。就像我打电话给next
一样,它需要知道“下一个”是什么。所以我认为每个请求都需要存储一些数据。
Express 添加了一些“不可见”的代码,可以通过req
、res
等。处理程序的顺序取决于您进行.use()
调用的顺序,这就像向管道序列添加回调一样。在某个时候,每个中间件调用都应该完成,那些被引用的对象会丢失它们的引用并被垃圾回收;即使您在 next
中间件中引用它们,在某些时候下一个函数也应该终止。以上是关于Node.js 内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章