节点的事件循环是否意味着我需要重新考虑用户变量存储?

时间:2014-03-04 10:24:11

标签: javascript node.js

我只是想到了节点为每个用户提供服务的方式,这让我感到困惑。

根据我的有限理解,使用PHP,为每个用户创建了一个新的(线程?)环境,因此我的脚本只需要关注一个单独的用户,这将适用于每个人。

现在,从我对节点的非常有限的了解,一个事件循环正在处理我的所有用户。因此,在此脚本代码段中,

//imaginary script to validate user's post to server (log-in attempt) next:

console.log('user logged in successfully!');

var username =  req.body.username;

//imaginary script that takes the username and processes it somehow, using my username variable

如果其他用户自上次用户登录后,username变量将被覆盖,现在一切都搞砸了。而使用PHP,当一个新用户连接时,他将被处理一个新的重置环境..

这可能不完全正确,但我认为我看到的是我需要在客户端保留所有与用户相关的数据,并将客户端和服务器之间的所有内容作为包传递,而不是保留服务器端存储的任何用户数据。

我是否在这里,完全困惑,还是有更好的方式来考虑这个?

1 个答案:

答案 0 :(得分:1)

这一切都取决于变量的范围(创建它的位置)。考虑这个简单而简化的例子:

var http = require('http');

var variableOne = "foobar";

http.createServer(function (req, res) {

    var variableTwo = "barfoo";

}).listen(1337, '127.0.0.1');

variableOne有点全局,因为node.js在启动时只会通过变量声明一次。该变量在scipt中的任何位置都可用,因此每个请求/用户都可以更改它。

为node.js处理的每个请求创建

variableTwo。有可能,这个变量有多个版本。

处理永久用户数据时,您需要以某种方式存储它,以便以后的请求访问它,但对用户来说是唯一的。

再一个简化的例子:

var http = require('http');

var userData = {};

http.createServer(function (req, res) {

    userData[request.connection.remoteAddress] = "some unique user data";

}).listen(1337, '127.0.0.1');

每个IP地址将保存some unique user data。您可以稍后通过检查以前是否使用过IP地址来读取数据。这不是很实用,但应该给你一个想法。在现实世界的示例中,您将为每个用户生成一个唯一的cookie。