使用回调时express.js请求/响应对象的生命周期

粒子xlr8r

如果这是一个多余的问题,请随时整理我。(在询问之前,我已经进行了尽可能多的搜索)

我拼命试图了解请求/响应对象的生命周期。

考虑以下框架代码:

app.get('/', function(req, res) {

  var setCookie = function(err, idCookie) { //callback after cookieSearch in DB
    // ... do something with the result of findCookieInDatabase() (handle error, etc.);
    res.sendfile('index.html');
  }

  var cookie = parseCookie(req.get('Cookie')); //parse and format cookie

  findCookieInDatabase(cookie, afterCookieSearch); //tries to find cookie is DB


  // .. do some content return stuff, etc.
}

(请注意,原始代码还有很多其他功能,例如检查“ Cookie”是否存在等)。

我理解将创建req和res对象,并且必须在某些时候对其进行垃圾回收。(有人希望)

当使用setCookie作为参数调用findCookieInDatabase()时,我假设setCookie当时只是一个字符串(包含函数),直到在findCookieInDatabase()中遇到callback(setCookie)语句之前,都不会被解析或执行。

我还了解到,上述假设可能是完全错误的,这是由于我缺乏对javascript回调函数的了解。(我对此也进行了很多搜索,但是我能找到的是关于如何使用回调的无休止的tut。没什么好说的)

所以问题是这样的:javascript(或node.js)如何知道使“ res”保持生存状态的时间以及何时可以进行垃圾回收?

setCookie中的res.sendfile行是否实际上充当活动引用,因为它是通过findCookieInDatabase()调用的?

只要任何被叫/回叫/事物的任何部分还活着,javascript是否实际上会跟踪所有引用并保持req和/或res活着?

任何帮助,不胜感激。谢谢阅读。

伊桑·布朗(Ethan Brown)

您的代码和假设有很多事情,这向我表明您应该学习一些JavaScript基础知识。我会推荐以下书籍:

当然还有我自己的书,《使用Node和Express进行Web开发》好的,既然我已经把所有的阅读材料都弄清楚了,那么让我尝试着手解决您的问题。

当节点接收到HTTP请求时,它创建reqres对象(开始他们生活的实例http.IncomingMessagehttp.ServerResponse分别地)。这些对象预期目的是它们与HTTP请求一样有效。也就是说,客户端发出HTTP请求,创建reqres对象,发生了很多事情,最后res调用了on的方法,该方法将HTTP响应发送回客户端,此时不再需要这些对象。

由于Node的异步特性,在任何给定时间都可能有多个reqres对象,仅根据它们所处的范围进行区分。这听起来可能令人困惑,但是实际上,您不必担心:在编写代码时,就像总是处理一个HTTP请求一样编写代码,而您的框架(例如Express)可以管理多个要求。

JavaScript确实确实有一个垃圾收集器,该垃圾收集器最终会在对象的引用计数降至零后对其进行重新分配。因此,对于任何给定的请求,只要有对req对象的引用(例如),该对象就不会被释放。这是一个Express程序的简单示例,该程序始终保存每个请求(顺便说一句,这是一个糟糕的主意):

var allRequests = [];
app.use(function(req, res, next) {
    allRequests.push(req);
    next();
});

这是一个糟糕的主意的原因是,如果您从不从中删除对象allRequests,则服务器将在处理流量时最终耗尽内存。

通常,使用Express,您将依赖异步函数,异步函数一旦完成工作便会调用回调。如果回调函数具有对reqres对象的引用,则在异步函数完成并执行回调之前(并且所有其他引用自然不在范围内),将不会释放它们。这是一个简单的示例,只会产生人为的延迟:

app.get('/fast', function(req, res) {
    res.send('fast!');
});

app.get('/slow', function(req, res) {
    setTimeout(function() {
        res.send('sloooooow');
    }, 3000);
});

如果您导航到/slow,则浏览器将旋转3秒钟。在另一个浏览器中,如果您/fast进行多次访问,您会发现它仍然有效。这是因为Express为每个请求都创建了reqres对象,而这两个对象都不相互干扰。但是res/slow请求相关联对象不会被释放,因为未执行回调(该回调保存对该实例的引用)。

归根结底,我觉得您想得太多了。当然,了解基础知识是件好事,但是在大多数情况下,您不必考虑或管理JavaScript中的引用计数和垃圾回收。

我希望这有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Node&Express:使用回调时发送404响应

如何在sails.js生命周期回调中访问请求对象?

使用 Redux 响应生命周期( componentDidMount )

使用回调的Express.js执行流程

未使用回调时函数返回未定义,使用回调时,JS 表示函数未定义

使用子生命周期范围时未处理的对象

实现dyn对象的特征时的神秘生命周期问题

借用新对象实例时如何指定生命周期?

使用生命周期参数声明特征对象的向量

使用回调函数作为Component @Input()时的Angular2未定义对象属性

使用Redux时反应生命周期

无法使用使用回调函数的 get 请求的响应

在特征对象上使用回调

Java流生命周期回调

javascript异步回调生命周期

当从 rust 请求中获取令牌时,生命周期与 trait 中的方法不匹配

从请求中获取令牌时,生命周期与特征中的方法不匹配

尝试使用 hyper 返回分块响应时“无法推断适当的生命周期”

在React中使用componentWillMount或componentDidMount生命周期函数进行异步请求

sails.js:模型的生命周期回调:它们是否支持beforeFind和afterFind?

SAILS JS 1.0模型回调生命周期未调用

取消sails.js模型生命周期回调中的默认行为

如何使用正确的请求和响应对象调用函数?

在 GCP 中编写对象生命周期规则时了解 IsLive 和存储类

使用哪种反应生命周期方法

使用React Hooks的生命周期问题

使用 Pandas 计算客户生命周期

Ruby on Rails - 创建新条目时使用回调将单独表中的两个对象相乘

尝试在Keras上使用回调保存模型时,顺序对象没有属性“ _ckpt_saved_epoch”错误