计数到我的网页点击次数

我开发了一个网页,用于对我公司的一些服务进行内部监控。 我们希望logging页面上的点击次数并实时显示。 我经历了这些问题:

确定网页被访问了多less次

我如何计算我的网站上使用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); }); 

每次有人访问我们的网页,我们发送一个请求从控制器到服务器,以增加计数器。 当多人同时访问网页时,这不会造成竞争状况吗? 有其他的方法吗?

我们也看了一下cookie,但是即使是同一个用户再次访问,我们也想增加柜台,即使可能,我也无法理解竞争状态如何避免?

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

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

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

我们希望logging页面上的点击次数并实时显示

在这种情况下,实时使用WebSockets,这似乎是一个更方便的解决scheme。 有了WebSockets,当有人closures页面时,你也可以减less“活”用户的数量。 你甚至不需要将数字存储在数据库中,除非你想跟踪每一页的命中。

你所做的userCount技巧是有趣的,但也有一个黑暗的一面:如果服务器重新启动,你失去了数字。

更新:

以下是你如何做到这一点:

  1. 当您收到一个页面命中时,您打开一个WebSocket连接。
  2. 打开连接成功后,增加实时计数器。
  3. 在成功打开连接时,增加数据库中的数字以跟踪所有命中。
  4. (可选)在closures连接时,递减实时计数器。