2017-06-14 11 views
4

私は私の会社のいくつかのサービスの内部監視のためのウェブページを開発しました。ヒット数をページに記録し、リアルタイムで表示したいと考えています。私が質問を介して行っています私のウェブページへのヒット数を数えよう

Determine how many times webpage has been accessed

How can I count the number of the visitors on my website using JavaScript?

しかし、私は、Googleの分析や他のそのようなツールを使用することはできません。私はそれが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); 
}); 

そして、毎回誰かが私たちのウェブページを訪問、我々はカウンターを高めるために、コントローラからの要求をサーバーに送信します。複数の人が同じ時間にWebページにアクセスするとき、これは競合状態を作りませんか?可能な他の方法がありますか?

クッキーも見ましたが、同じユーザーが再び訪問した場合でもカウンターを増やしたいと考えていますが、それでも可能な場合でも競合状態を回避できるかどうかわかりません。

+0

挿入ユーザーのIPアドレスまたはコンピュータのMAC ID uはuはまた、あなたのウェブサイト –

+1

にユニーク訪問者をカウントすることができcount.Countそれらの挿入records.Inserting MAC IDが必要になります[質問のタイトルにタグを入れないでください]( – Liam

答えて

5

1つのNode.jsプロセスを実行しているとすれば、競合状態がないことを確認できます。 Node.jsはシングルスレッドなので、すべてのJavaScriptコードは同期して実行されます。したがって、各リクエストは、一度に1つずつコントローラメソッドを実行します。

このアプローチの欠点の1つは、プロセスのメモリに格納されているサーバーを再起動するとすぐにuserCountが失われるということです。

複数のNode.jsプロセスを使用している場合、各Node.jsプロセスが異なるuserCountを保持するため、このメソッドは失敗します。唯一の失敗証明方法は、すでに競合状態(Most do)を処理してそこにカウントを格納する中央データベース(すべてのNode.jsプロセスに共通)を使用することです。

+0

私は単一のnode.jsプロセスを持っていると思います(質問に私のコードを編集しました)。次のコードを含む単一のserver.jsファイルがあるので、エンドユーザの別のアクションに応じて異なるルートに異なる呼び出しが行われますが、これはメインのサーバーファイルです。これはあなたがシングルプロセスの意味ですか? –

+2

はい、単一のNode.jsプロセスがあります。クラスタモジュールを使用する場合、または何らかの種類の負荷分散を使用して負荷を複数のサーバーまたはポートに均等に分散させる場合、複数のNode.jsプロセスが存在する可能性があります。基本的に複数のNode.jsプロセスとは、1つ以上のマシンまたは1つ以上のポートで同時にプロセスを実行し、受信した要求を実行中のすべてのプロセスと均衡させることを意味します。 –

2

我々はページ上のヒット数を記録し、その場合、実際の 時間

それを表示したい、あなたのケースでは、より便利なソリューションを思わリアルタイム、の利用WebSocketを。 WebSocketsを使用すると、誰かがページを閉じると、「生きている」ユーザーの数を減らすことができます。すべてのページヒットを追跡しない限り、データベースに番号を格納する必要はありません。

userCountトリックは面白いですが、暗い面もあります。サーバーを再起動すると、その番号が失われます。

UPDATE:

は、ここであなたがそれを行う方法は次のとおりです。

  1. ページ・ヒットを受信したとき、あなたはWebSocketの接続を開きます。
  2. 接続を正常に開いたら、ライブ番号カウンタを増分します。
  3. 接続を正常に開くと、すべてのヒットを追跡するためにデータベース内の数字を増やします。
  4. (オプション)接続を閉じるときに、ライブ番号カウンタを減らします。
+1

すべてのヒット数を記録することも、ライブユーザーのみを記録することもできますか?我々はすべてのヒットのカウンターを保持する必要があります。そして、サーバが再起動したときに、ここで番号を失うことはできません。 –

+0

@NagireddyHanishaが私の答えを更新しました – evilReiko

関連する問題