2017-06-14 137 views
4

我開發了一個網頁,用於我公司的一些服務的內部監控。我們希望記錄頁面上的點擊次數並實時顯示。我已經通過了問題:計算我的網頁點擊次數

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

插入用戶IP地址或計算機的MAC ID,當你需要count.Count這些插入的記錄。插入MAC ID U也可以計算您的網站上的唯一訪問者 –

+1

[請不要把標籤問題標題]( https://stackoverflow.com/help/tagging) – Liam

回答

5

假設您正在運行一個Node.js流程,那麼您可以確定沒有競爭條件。 Node.js是單線程的,因此所有的javascript代碼都是同步執行的。所以每個請求都會一次運行一個控制器方法。

這種方法的一個缺點是您的userCount會在您重啓服務器時立即丟失,因爲它存儲在進程內存中。

但是,如果您使用多個Node.js進程,則此方法將失敗,因爲每個Node.js進程將保留其自己的不同userCount。唯一的失敗證明方法是使用已經處理競爭條件(大多數)的中央數據庫(對所有Node.js進程通用)並將計數存儲在那裏。

+0

我想我有一個node.js過程(我已經在問題中編輯了我的代碼)。正如我在下面的代碼中有一個server.js文件 - 根據最終用戶的不同操作對不同的路由進行不同的調用,但這是主要的服務器文件。這是你的意思是單一過程? –

+2

是的,你有一個Node.js進程。使用羣集模塊時可以有多個Node.js進程,或使用某種負載平衡來平衡負載到多個服務器或端口。基本上,多個Node.js進程意味着您可以同時在多於一臺機器或多個端口上運行進程,然後將傳入請求平衡到所有正在運行的進程。 –

2

我們希望記錄在頁面上點擊次數和實時 時間

顯示它在這種情況下,使用WebSockets進行實時,這似乎是在你的情況更爲方便的解決方案。使用WebSockets,當有人關閉頁面時,您也可以減少「活」用戶的數量。你甚至不需要將數字存儲在數據庫中,除非你想跟蹤每一頁命中。

userCount你做的技巧很有趣,但也有一個陰暗的一面:如果服務器重新啓動,你會失去這個數字。

UPDATE:

這裏是你如何做到這一點:

  1. 當您收到一個頁面命中,你打開一個WebSocket連接。
  2. 成功打開連接後,增加實時計數器。
  3. 成功打開連接後,在數據庫中增加一個數字以跟蹤所有匹配。
  4. (可選)關閉連接時,遞減實時計數器。
+1

是否有可能記錄所有點擊數或僅有活用戶數?我們需要保留所有命中的計數器。當服務器重新啓動時,我們如何能夠在這裏不會丟失數字? –

+0

@NagireddyHanisha更新了我的答案 – evilReiko