我对node.js相当陌生,并试图了解异步处理循环等。
因此,假设我在var counter = [];
文件的顶部定义了一个数组server.js
然后我有一个POST
处理程序如下
app.post("/test_post", function(req, res) {
console.log(req.body);
counter ++;
})
我正在尝试了解 计数器 变量的范围 - 每个 客户端 会有所不同吗?或者它会在客户中普遍存在。
另外,我正在寻找一种增加相同客户端计数器的方法,换句话说,我想为每个访问客户提供一个计数器。
我怎样才能做到这一点? 感谢
答案 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);