Pourquoi différentes sessions node.js partagent-elles des variables?

Voici un programme simple:

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

Lorsque je l’ouvre dans deux navigateurs différents, le premier affiche 0 et le second 1 .

Pourquoi? Il s’agit de sessions différentes, je suppose donc que node.js utilise différents processus enfants pour elles. D’après ce que je comprends, avec PHP, les variables de partage doivent être implémentées à l’aide de bases de données.

Pourquoi node.js peut-il le faire sans stockage externe? Est-ce un processus unique mais plusieurs threads?

Comment déclarer une variable appartenant à une session spécifique?

Node.js est un processus unique.

Votre code s’exécute dans un processus unique au sumt d’un eventloop.

JavaScript est un seul thread. Chaque morceau de code que vous exécutez est à thread unique. Node.js est rapide et évolue car il ne bloque pas sur IO (IO est le goulot de la bouteille).

Fondamentalement, tout javascript que vous exécutez est à thread unique. JavaScript est insortingnsèquement mono-threadé.

Lorsque vous appelez des parties de l’API nodeJS, elle utilise le threading en interne au niveau C ++ pour s’assurer qu’elle peut vous envoyer les demandes entrantes pour les serveurs HTTP ou vous renvoyer les fichiers pour l’access aux fichiers. Cela vous permet d’utiliser des E / S asynchrones

Comme pour les 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++; }); 

Le “problème” que vous voyez n’est pas spécifique au noeud. C’est juste une fonction de scope en javascript. Vous avez déclaré votre variable dans une étendue qui durera toute la vie du serveur, pas la requête.

Déclarer votre variable dans la fonction utilisée pour répondre à votre itinéraire résoudra votre problème:

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

node.js est essentiellement à un seul thread, en fait.

Chaque demande à un script PHP est gérée par une instance PHP distincte, mais s’exécute dans le même processus serveur (souvent Apache).

Un script node.js est à la fois le serveur et le gestionnaire. Étant donné que l’état est détenu par le serveur, il est préservé entre les demandes. Pour une persistance à long terme, vous voudriez utiliser une firebase database comme en PHP. Toutefois, si vous souhaitez implémenter un serveur de discussion ou une solution pour laquelle la mémoire à long terme n’a pas d’importance, conserver tout cela dans la mémoire du serveur peut simplifier les choses.

Node.js est à thread unique, ce qui permet de réduire les coûts liés à la création de processus / threads enfants. Et cela nécessite l’utilisation de fonctions asynchrones et de callbacks, de sorte que Node puisse traiter d’autres requêtes lorsque la précédente est bloquée, et offre de bonnes performances lorsque l’application se concentre sur un trafic de données important, mais pas sur des calculs.

C’est un peu comme le concept de functional programming, vous devez manipuler les variables avec soin.
Vous devez utiliser la fermeture pour créer un espace pour chaque demande si vous le souhaitez. Mais gardez à l’esprit que la fermeture ne peut pas être optimisée facilement par le moteur JS.