这是一个简单的程序:
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为它们使用不同的子进程。我对PHP的理解是,共享变量应该使用数据库来实现。
为什么node.js可以在没有任何外部存储的情况下执行此操作?它是单进程还是多线程?
如何声明属于特定会话的变量?
答案 0 :(得分:14)
Node.js是单个进程。
您的代码在事件循环的顶部单个进程中运行。
JavaScript是单线程的。您运行的每一段代码都是单线程的。 Node.js速度快,可以扩展,因为IO上的不阻塞(IO是瓶颈)。
基本上你运行的任何javascript都是单线程的。 JavaScript是不可思议的单线程。
当您调用nodeJS API的某些部分时,它会在C ++级别内部使用线程,以确保它可以向您发送HTTP服务器的传入请求,或者将文件发送回文件访问。这使您可以使用异步IO
至于sessions
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++;
});
答案 1 :(得分:11)
您所看到的“问题”并非特定于节点。它只是javascript中作用域的功能。您已经在服务器生命周期内的范围内声明了您的变量,而不是请求。
在用于响应路线的函数中声明变量将解决您的问题:
var express = require('express');
var app = express.createServer();
app.get("/", function(req, res) {
var count = 0;
res.send(count.toString());
count++;
});
app.listen(3000);
答案 2 :(得分:3)
node.js实际上是单线程的。
对PHP脚本的每个请求都由一个单独的PHP实例处理,但它在同一服务器进程(通常是Apache)中执行。
node.js脚本既是服务器又是处理程序。由于状态由服务器保存,因此它在请求之间保留。对于长期持久性,您可能希望使用PHP中的数据库。但是,如果要实现聊天服务器或长期内存不重要的东西,将其全部保存在服务器的内存中可以简化操作。
答案 3 :(得分:0)
Node.js是单线程的,可以减少子进程/线程创建的开销。并且它使用asyn函数和回调,因此Node可以在前一个请求被阻止时处理其他请求,并在应用程序专注于大量数据流量而不是计算时提供良好的性能。
这有点像函数式编程的概念,你需要仔细处理变量 如果需要,您应该使用闭包为每个请求创建一个空间。但请记住,JS引擎无法轻松优化闭包。