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

时间:2011-06-15 13:00:57

标签: node.js express

这是一个简单的程序:

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可以在没有任何外部存储的情况下执行此操作?它是单进程还是多线程?

如何声明属于特定会话的变量?

4 个答案:

答案 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引擎无法轻松优化闭包。

相关问题