0

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

所以让我们假设我在文件var counter = [];顶部定义了一个数组server.js

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

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

我试图了解计数器变量的范围 - 每个客户都会有所不同,还是会在客户之间通用。

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

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

4

3 回答 3

1

我试图了解计数器变量的范围 - 每个客户都会有所不同,还是会在客户之间通用。

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

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

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

看看这个实现它可能会对你有所帮助。

于 2013-07-04T16:34:02.723 回答
1

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

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

于 2013-07-04T17:00:15.360 回答
1

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

要回答有关跟踪访问次数的问题,您必须建立连接客户端的识别模式。HTTP 是无状态的,因此 HTTP 连接没有现有状态,但是可以使用会话/cookies 来实现。此外,如果您打算基于非 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);
于 2013-07-04T17:12:20.037 回答