node js - 理解变量范围

时间:2013-07-04 16:25:40

标签: javascript node.js express

我对node.js相当陌生,并试图了解异步处理循环等。

因此,假设我在var counter = [];文件的顶部定义了一个数组server.js

然后我有一个POST处理程序如下

app.post("/test_post", function(req, res) {
    console.log(req.body);
    counter ++;
})

我正在尝试了解 计数器 变量的范围 - 每个 客户端 会有所不同吗?或者它会在客户中普遍存在。

另外,我正在寻找一种增加相同客户端计数器的方法,换句话说,我想为每个访问客户提供一个计数器。

我怎样才能做到这一点? 感谢

3 个答案:

答案 0 :(得分:1)

  

我试图理解计数器变量的范围 - 对于每个客户来说它是不同的还是在客户端都是常见的。

由于您在全球范围内定义它,因此它将在客户端中很常见。

  

另外,我正在寻找一种增加同一客户端计数器的方法,换句话说,我想为每个访问客户提供一个计数器。

基本上你需要做的就是听connection&每个客户端的disconnection并将计数器保存在相应的客户端对象中。

看看这个implementation它可能对你有所帮助。

答案 1 :(得分:1)

你的counter变量将被初始化一次,然后你可以递增它。

注释 在已发布的示例counter中是一个数组var counter = [];,因此您可以增加它。把它改成一个数字,它应该适合你

答案 2 :(得分:1)

与PHP等脚本语言不同。 NodeJS是一个长期运行的过程,应该与Java或.NET进行比较。因此,您的文件可以通过module公开内容,这是一个单例。因此,counter变量的范围是该特定模块的节点进程中的字段。如果有多个节点进程运行相同的模块,则counter变量不同(例如,在分叉进程时)。这同样适用于不同模块中的变量,这是一个完全不同的内存地址,因此与vanilla浏览器环境不同,它不可能产生名称冲突。

要回答有关跟踪访问次数的问题,您必须建立连接客户端的识别模式。 HTTP是无状态的,因此HTTP连接没有现有状态,但是可以使用会话/ cookie来实现。此外,如果您打算基于非cookie技术进行跟踪,您可以使用浏览器指纹识别或仅使用IP地址。将其存储在进程范围变量中是一个坏主意,因为在重新启动进程时您将丢失此类信息。因此,您应该使用数据库,当然,假设您希望此信息存在很长时间。

这是一个非常天真的使用进程范围存储的实现,可能会爆炸内存......

var express = require('express');
var app = express();
var counters = {};
app.get('/', function (req, res) {
    if (typeof counters[req.ip] !== 'undefined') {
        counters[req.ip]++;
    } else {
        counters[req.ip] = 1;
    }
    res.send('You visited #' + counters[req.ip] + ' times!');
});
app.listen(80);
相关问题