Javascript Node.js内存泄漏?
下面是我在Express.js应用程序中用来集中acl逻辑的一些代码。如果函数显式返回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
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
调用吗?这在什么情况下有用?