我开发了一个网页,用于内部监控我公司的某些服务。我们希望记录页面上的点击次数并实时显示。我已经完成了这些问题:
Determine how many times webpage has been accessed
How can I count the number of the visitors on my website using 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,但是即使同一个用户再次访问我们也希望增加计数器,即使可能,我也无法理解如何避免竞争条件?
答案 0 :(得分:5)
假设您正在运行单个Node.js进程,那么您可以确定没有竞争条件。 Node.js是单线程的,因此所有的javascript代码都是同步执行的。因此,每个请求将一次运行一个控制器方法。
这种方法的一个缺点是,只要重新启动服务器,您的userCount
就会丢失,因为它存储在流程中。存储器中。
但是,如果您使用多个Node.js进程,则此方法将失败,因为每个Node.js进程将保持其自己的不同userCount
。唯一的失败证明方式是使用一个中央数据库(所有Node.js进程通用),它已经处理竞争条件(大多数情况下)并将计数存储在那里。
答案 1 :(得分:2)
我们希望记录页面上的点击次数并将其显示为真实 时间
在这种情况下,请实时使用WebSockets,这在您的案例中似乎是一种更方便的解决方案。使用WebSockets,当有人关闭页面时,您可以减少" live"用户也是。您甚至不需要将数字存储在数据库中,除非您想跟踪每个页面的命中。
你正在做的userCount
技巧很有意思,但也有一个黑暗面:如果服务器重新启动,你会丢失数字。
<强>更新强>
以下是您的工作方式: