2013-02-28 45 views
1

nodejs文档说明nodejs模块是否跨多个HTTP请求缓存?

模块在第一次加载后被缓存。 这意味着(除其他事项外)每次调用需要(“富”)将得到 完全相同的对象返回,如果它会解析为同 文件。

但它没有指定的范围。加载的模块是否缓存了多个调用,以便在当前的HTTP请求或多个HTTP请求中需要('module')?

回答

3

是的,他们是。

不同于其他常见的服务器环境,如PHP, 请求完成后使Node.js服务器不会关闭。

假设你正在使用的优秀express框架,也许这个例子有助于我们理解上的差异:

... // setup your server 

// do a route, that will show a call-counter 
var callCount = {}; 

app.get('/hello/:name', function(request, response) { 
    var name = request.params.name; 
    callCount[name] = (callCount[name] || 0) + 1 

    response.send(
    "Hello " + name + ", you invoked this " + callCount[name] + " times"); 
    }); 
}); 

当调用curl localhost:3000/hello/Dave您将收到每个后续调用一个较大的数字。

第一个呼叫:Hello Dave, you invoked this 1 times

第二个呼叫:Hello Dave, you invoked this 2 times

...等等...

所以你callCount将被任何请求,这条路线修改。它来自哪里并不重要,它可以在您的require ing的任何模块中定义。

无论如何,这些变量,任何模块中定义的,将当复位服务器重新启动。 你可以反驳说,通过将它们放入一个商店,被分离从你的Node.js的过程,就像一个Redis商店(见node-redis),一个文件系统上的文件或数据库,像MongoDB。最终取决于你。你只需要知道你的数据来自哪里并去往哪里。

希望有所帮助。

0

是的。同样来自文档:


    Multiple calls to require('foo') may not cause the module code to be executed 
    multiple times. This is an important feature. With it, "partially done" 
    objects can be returned, thus allowing transitive dependencies to be loaded 
    even when they would cause cycles. If you want to have a module execute code 
    multiple times, then export a function, and call that function. 
+0

文档没有指定缓存是跨越多个HTTP请求还是多次调用require('foo')来处理当前的HTTP请求。 – Rajiv 2013-02-28 08:33:52

+0

哦。文档可能不是非常明确,但是它们被缓存用于多个请求。 :) – L0j1k 2013-02-28 08:36:12

相关问题