gpt4 book ai didi

javascript - Node.js 内存泄漏?

转载 作者:IT老高 更新时间:2023-10-28 23:17:08 24 4
gpt4 key购买 nike

下面有一些代码,我在我的 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();
}
});

最佳答案

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

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

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

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

关于javascript - Node.js 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32945236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com