为什么不同的node.js会话共享variables?

这是一个简单的程序:

var express = require('express'); var app = express.createServer(); var count = 0; app.get("/", function(req, res) { res.send(count.toString()); count++; }); app.listen(3000); 

当我在两个不同的浏览器中打开它时,第一个显示0 ,第二个显示1

为什么? 他们是不同的会议,所以我希望node.js使用不同的subprocess。 我对PHP的理解是共享variables应该使用数据库来实现。

为什么node.js没有任何外部存储? 这是一个单进程,但multithreading?

我如何声明属于特定会话的variables?

       

网上收集的解决方案 "为什么不同的node.js会话共享variables?"

Node.js是单一进程。

你的代码运行在一个eventloop的ontop上。

JavaScript是单线程的。 你运行的每一段代码都是单线程的。 Node.js速度快,因为它不会阻塞IO(IO是瓶颈)。

基本上你运行的任何JavaScript都是单线程的。 JavaScript是不可思议的单线程。

调用nodeJS API的一部分时,它会在C ++级别内部使用线程来确保它可以向HTTP服务器发送传入请求,或者将文件发回给文件访问。 这使您可以使用asynchronousIO

至于会议

 app.use(express.session({ secret: "Some _proper_ secret" })); ... app.get("/", function(req, res) { if (req.session.count == null) { req.session.count = 0; } res.send(req.session.count); req.session.count++; }); 

你看到的“问题”不是特定于节点的。 这只是在javascript中作用域的function。 你已经声明了你的variables在一个服务器生命周期的范围内,而不是请求。

在用于响应路由的函数中声明variables将解决您的问题:

 var express = require('express'); var app = express.createServer(); app.get("/", function(req, res) { var count = 0; res.send(count.toString()); count++; }); app.listen(3000); 

实际上,node.js基本上是单线程的。

对PHP脚本的每个请求都由一个单独的PHP实例处理,但是它在相同的服务器进程(通常是Apache)中执行。

node.js脚本既是服务器又是处理程序。 由于状态由服务器保存,所以在请求之间保留。 对于长期的持久性,你会想在PHP中使用数据库。 但是,如果你想实现一个聊天服务器或者长期内存不重要的东西,把它全部放在服务器的内存中可以简化一些事情。

Node.js是单线程的,可以减lesssubprocess/线程创build的开销。 它使用asynchronous函数和callback函数,以便节点可以在前一个请求被阻塞时处理其他请求,并在应用专注于繁重的数据stream量而不是计算时提供良好的性能。

这有点像函数式编程的概念,你需要仔细处理variables。
如果需要,您应该使用闭包为每个请求创build一个空间。 但请记住,closures不能通过JS引擎轻松优化。