1

nodejs 文档说

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

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

4

2 回答 2

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 进程分离的 Store 来解决这个问题,例如Redis Store(请参阅node-redis)、文件系统上的文件或数据库(例如MongoDB)。最后由你决定。您只需要了解数据的来源和去向。

希望有帮助。

于 2013-02-28T09:16:26.330 回答
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.
于 2013-02-28T08:32:20.263 回答