Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js内存泄漏?_Javascript_Node.js_Express_Memory Leaks - Fatal编程技术网

Javascript Node.js内存泄漏?

Javascript Node.js内存泄漏?,javascript,node.js,express,memory-leaks,Javascript,Node.js,Express,Memory Leaks,下面是我在Express.js应用程序中用来集中acl逻辑的一些代码。如果函数显式返回true或false,则中间件可以处理下一次调用。但如果它不返回,则由授权逻辑在完成该操作时执行next() 为了避免写入错误数据,我只想传入一个可以调用的error()函数,它只在内部调用next函数 有人告诉我,这可能会导致某种内存泄漏,因为next函数位于它自己的闭包中,并从外部引用它。我在网上看到很多例子都使用了类似的技术,但我对Node.js还是很陌生,所以想知道这是否属实 this.router.u

下面是我在Express.js应用程序中用来集中acl逻辑的一些代码。如果函数显式返回
true
false
,则中间件可以处理
下一次调用。但如果它不返回,则由授权逻辑在完成该操作时执行
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();
    }
});

当您设置中间件时,
.use()
方法在那里被调用一次,匿名处理程序/中间件被写入内存一次,每个新请求都会调用相同的中间件函数

err
变量在中间件每次运行时都被实例化,它是一个不同的对象。如果将它放在
.use()
的闭包范围之外,那么它将是同一个对象

然后它被传递到
next
,而
next
很可能是另一个中间件函数,它被实例化一次,并在内存中保持不变,从而持续并抓住它的闭包访问


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

Hmm,我不确定
next
是否只是另一个函数。它需要以某种方式获得有关当前请求的信息,以避免干扰其他请求。比如,如果我调用
next
它需要知道什么是“next”。因此,我认为每个请求都需要存储一些数据。Express添加了一些“不可见”的代码,将
req
res
等传递给用户。处理程序的顺序由执行
.use()
调用的顺序决定,这就像向管道序列添加回调一样。在某个时刻,每个中间件调用都应该完成,这些被引用的对象将丢失其引用并被垃圾回收;即使您在
next
中间件中引用了它们,在某个时刻,next函数也应该终止。我可以问一下,您为什么希望authorize方法来处理
next
调用吗?这在什么情况下有用?