2013-08-20 11 views
5

Mój kod źródłowy:Liczenie odwiedzających w węzeł serwera http

var http = require("http"); 
var count=1; 

http.createServer(function(request, response) { 
response.writeHead(200, {"Content-Type": "text/plain"});  
response.write("Hi, you are number "+count+" visitors"); 
response.end(); 
count++; 
    }).listen(8888); 

mam 1,3,5,7 ..... w każdej wizyty. Dlaczego zwiększać liczbę o 2?

Odpowiedz

8

Żądanie na numer favicon.ico powoduje wygenerowanie dodatkowego żądania (potwierdziłem to, logując się do każdego żądania, a następnie wysyłając zwykłe żądanie w przeglądarce Chrome).

Będziesz musiał dokładnie przejrzeć typ zapytania (URL, metoda itp.), Który chcesz dopasować.

Pamiętaj też, że jeśli serwer zginie, co prawdopodobnie nastąpi na pewnym etapie, twój licznik zostanie zresetowany. Jeśli tego nie chcesz, powinieneś go utrzymywać gdzieś mniej zmiennym, takim jak baza danych.

+0

typu żądania? Po prostu używam localhost: 8888 w przeglądarce. Kiedy resetuję serwer, zaczyna się od 1,3,5, ... od nowa. – user1780176

+0

@ user1780176 Mam na myśli zbadanie informacji o żądaniu, takich jak adres URL. Nie miałem na myśli typu, jak w 'GET',' POST', itp. – alex

+0

Rozumiem, że zdarzenie jest wyzwalane, a następnie polecenie jest wykonywane. Pętla zdarzeń działa tylko raz. Dobrze? – user1780176

0

Jeśli twój serwer jest tylko prostym licznikiem i wie, że żądanie do favicon.ico wyzwala dodatkowe żądanie, możesz łatwo zliczyć każde żądanie jako połowę, co spowoduje dokładną liczbę odwiedzin.

counter = counter + 0.5; 
+4

To jest dość kruche, nie możesz zagwarantować, że każde żądanie będzie próbowało pobrać również "favicon.ico". – alex

0

Można zignorować prośbę o Favicon.ico:

var server = http.createServer(function (req, res) { 
    if(req.url === '/favicon.ico'){ 
     console.log('favicon'); 
     return; 
    } 
    userCount++; 
    res.writeHead(200, { 'Content-Type': 'text/plain' }); 
    res.write('Hello!\n'); 
    res.write('We have had ' + userCount + ' visits!\n'); 
    res.end(); 

});