nodejs模块是否跨多个HTTP请求缓存?

时间:2013-02-28 08:30:02

标签: node.js

nodejs文档说

  

模块在第一次加载后进行缓存。   这意味着(除其他外)每次调用require('foo')都会得到   返回完全相同的对象,如果它将解析为相同   文件。

但它没有指明范围。加载的模块是否在当前HTTP请求中或多个HTTP请求中缓存多次调用require('module')?

2 个答案:

答案 0 :(得分: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的任何模块中定义。

无论如何,在服务器重启时,将重置在任何模块中定义的变量。 您可以通过将它们放入与您的node.js进程分开的商店来解决这个问题,例如Redis商店(请参阅node-redis),文件系统上的文件或数据库,例如MongoDB。最后,这取决于你。您只需要知道数据的来源和去处。

希望有所帮助。

答案 1 :(得分: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.