Node.js 内存泄漏?

Posted

技术标签:

【中文标题】Node.js 内存泄漏?【英文标题】:Node.js memory leaks? 【发布时间】:2016-01-01 21:51:51 【问题描述】:

下面有一些代码,我在我的 Express.js 应用程序中使用这些代码来集中一些 acl 逻辑。如果函数显式返回truefalse,则中间件可以处理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() 的闭包范围之外,它就会是同一个对象。

然后将其传递给nextnext 很可能是另一个中间件函数,它被实例化一次并在内存中保持不变,并持续存在并获取其闭包访问权限。

但是,当next 函数完成运行时,err 指向的对象将丢失其引用——它应该被垃圾回收。

【讨论】:

嗯,我不确定next 是否只是另一个函数。它需要以某种方式获得有关当前请求的信息,以免干扰其他请求。就像我打电话给next 一样,它需要知道“下一个”是什么。所以我认为每个请求都需要存储一些数据。 Express 添加了一些“不可见”的代码,可以通过reqres 等。处理程序的顺序取决于您进行.use() 调用的顺序,这就像向管道序列添加回调一样。在某个时候,每个中间件调用都应该完成,那些被引用的对象会丢失它们的引用并被垃圾回收;即使您在 next 中间件中引用它们,在某些时候下一个函数也应该终止。

以上是关于Node.js 内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

检测代码中的 node.js/javascript 内存泄漏

使用 Node.js 服务器调试内存泄漏

Node.js中的内存泄漏分析

node.js内存泄漏分析二

Node.js内存泄漏的原因竟然是……?

如何防止 node.js 中的内存泄漏?