如果这是一个多余的问题,请随时整理我。(在询问之前,我已经进行了尽可能多的搜索)
我拼命试图了解请求/响应对象的生命周期。
考虑以下框架代码:
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活着?
任何帮助,不胜感激。谢谢阅读。
您的代码和假设有很多事情,这向我表明您应该学习一些JavaScript基础知识。我会推荐以下书籍:
当然还有我自己的书,《使用Node和Express进行Web开发》。好的,既然我已经把所有的阅读材料都弄清楚了,那么让我尝试着手解决您的问题。
当节点接收到HTTP请求时,它创建req
和res
对象(开始他们生活的实例http.IncomingMessage
和http.ServerResponse
分别地)。这些对象的预期目的是它们与HTTP请求一样有效。也就是说,客户端发出HTTP请求,创建req
和res
对象,发生了很多事情,最后res
调用了on的方法,该方法将HTTP响应发送回客户端,此时不再需要这些对象。
由于Node的异步特性,在任何给定时间都可能有多个req
和res
对象,仅根据它们所处的范围进行区分。这听起来可能令人困惑,但是实际上,您不必担心:在编写代码时,就像总是处理一个HTTP请求一样编写代码,而您的框架(例如Express)可以管理多个要求。
JavaScript确实确实有一个垃圾收集器,该垃圾收集器最终会在对象的引用计数降至零后对其进行重新分配。因此,对于任何给定的请求,只要有对req
对象的引用(例如),该对象就不会被释放。这是一个Express程序的简单示例,该程序始终保存每个请求(顺便说一句,这是一个糟糕的主意):
var allRequests = [];
app.use(function(req, res, next) {
allRequests.push(req);
next();
});
这是一个糟糕的主意的原因是,如果您从不从中删除对象allRequests
,则服务器将在处理流量时最终耗尽内存。
通常,使用Express,您将依赖异步函数,异步函数一旦完成工作便会调用回调。如果回调函数具有对req
或res
对象的引用,则在异步函数完成并执行回调之前(并且所有其他引用自然不在范围内),将不会释放它们。这是一个简单的示例,只会产生人为的延迟:
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为每个请求都创建了req
和res
对象,而这两个对象都不相互干扰。但是res
与/slow
请求相关联的对象不会被释放,因为未执行回调(该回调保存对该实例的引用)。
归根结底,我觉得您想得太多了。当然,了解基础知识是件好事,但是在大多数情况下,您不必考虑或管理JavaScript中的引用计数和垃圾回收。
我希望这有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句