计算我的网页的点击次数

Nag*_*sha 4 javascript node.js angularjs

我已经开发了一个网页,用于内部监控我公司的一些服务.我们希望记录页面上的点击次数并实时显示.我已经完成了这些问题:

确定访问网页的次数

如何使用JavaScript计算我网站上的访问者数量?

但我不能使用谷歌分析和其他此类工具.我希望它可以在nodejs中完成.问题是如果我在nodejs服务器上做这样的事情:

var express = require('express');
var app = express();

var bodyParser = require('body-parser');
var request = require('request');
var cfenv = require('cfenv');
app.use(express.static(__dirname + "/public"));
app.use(bodyParser.json());
var userCount = 0;
app.post('/counterIncrement', function(req, res){
console.log("I received a request to refresh the counter");
userCount = userCount + 1;
res.json({countNum: userCount});
});
var router1 = require('./public/routes/Route1');
router1(app);

var router2 = require('./public/routes/Route2');
router2(app);

var router3 = require('./public/routes/Route3');
router3(app);

var appEnv = cfenv.getAppEnv();

app.listen(appEnv.port, appEnv.bind, function() {

   console.log("server starting on " + appEnv.url); 
});
Run Code Online (Sandbox Code Playgroud)

每当有人访问我们的网页时,我们都会从控制器向服务器发送请求以增加计数器.当多人同时访问网页时,这不会造成竞争条件吗?还有其他方法吗?

我们也看了一下cookie,但是即使同一个用户再次访问我们也希望增加计数器,即使可能,我也无法理解如何避免竞争条件?

Jyo*_*ngh 5

假设您正在运行单个Node.js进程,那么您可以确定没有竞争条件.Node.js是单线程的,因此所有的javascript代码都是同步执行的.因此,每个请求将一次运行一个控制器方法.

这种方法的一个缺点是,userCount一旦重新启动服务器就会丢失,因为它存储在进程的内存中.

但是,如果您使用多个Node.js进程,则此方法将失败,因为每个Node.js进程将保持自己的不同userCount.唯一的失败证明方式是使用中央数据库(所有Node.js进程通用),它已经处理竞争条件(大多数情况下)并将计数存储在那里.

  • 是的,你有一个Node.js进程.当您使用群集模块或使用某种负载平衡来平衡负载到多个服务器或端口时,可能有多个Node.js进程.基本上,多个Node.js进程意味着您可以同时在多个计算机或多个端口上运行您的进程,然后平衡传入的请求到所有正在运行的进程. (2认同)