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

Lai*_*uan 12 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);
Run Code Online (Sandbox Code Playgroud)

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

为什么?它们是不同的会话,所以我希望node.js为它们使用不同的子进程.我对PHP的理解是,共享变量应该使用数据库来实现.

为什么node.js可以在没有任何外部存储的情况下这样做?它是单进程但是多线程吗?

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

Ray*_*nos 14

Node.js是单个进程.

您的代码在eventloop的ontop上运行.

JavaScript是单线程的.您运行的每一段代码都是单线程的.Node.js的是快和规模,因为它并没有对IO块(IO是瓶颈).

基本上你运行的任何javascript都是单线程的.JavaScript是单线程的.

当您调用nodeJS API的某些部分时,它会在C++级别内部使用线程,以确保它可以向您发送HTTP服务器的传入请求,或者将文件发送回文件访问.这使您可以使用异步IO

至于会议

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++;
});
Run Code Online (Sandbox Code Playgroud)

  • 呃......每一段代码都是单线程的,但内部使用多线程?你的意思是什么? (2认同)

Mat*_*rte 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);
Run Code Online (Sandbox Code Playgroud)