2013-08-20 70 views
5

mã nguồn của tôi:khách Đếm trong một máy chủ nút 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); 

tôi đã 1,3,5,7, ..... trong mỗi lần truy cập. Tại sao tăng số lượng lên 2?

Trả lời

8

Yêu cầu đến favicon.ico đang kích hoạt yêu cầu bổ sung (Tôi đã xác nhận điều này bằng cách ghi lại chi tiết cho từng yêu cầu và sau đó đưa ra yêu cầu bình thường với Chrome).

Bạn cần xem xét một cách rõ ràng loại yêu cầu (url, phương thức, v.v.) mà bạn muốn khớp.

Ngoài ra, hãy nhớ, nếu máy chủ của bạn bị chết, có thể máy chủ sẽ ở một số giai đoạn, số của bạn sẽ được đặt lại. Nếu bạn không muốn điều đó, bạn nên duy trì nó ở đâu đó ít biến động hơn, chẳng hạn như cơ sở dữ liệu.

+0

Các loại yêu cầu? Tôi chỉ cần sử dụng localhost: 8888 trong trình duyệt. Khi tôi thiết lập lại máy chủ, nó bắt đầu từ 1,3,5, ... tất cả lại. – user1780176

+0

@ user1780176 Tôi muốn kiểm tra thông tin của yêu cầu, chẳng hạn như URL. Tôi không có nghĩa là kiểu như trong 'GET',' POST', v.v. – alex

+0

Sự hiểu biết của tôi là sự kiện được kích hoạt và sau đó lệnh được thực hiện. Vòng lặp sự kiện chỉ chạy một lần. Đúng? – user1780176

0

Nếu máy chủ của bạn chỉ là bộ đếm đơn giản và biết rằng yêu cầu đến favicon.ico đang kích hoạt yêu cầu bổ sung, thì bạn có thể đếm mọi yêu cầu một nửa để có kết quả chính xác số lượt truy cập.

counter = counter + 0.5; 
+4

Đó là khá mong manh, bạn không thể đảm bảo rằng mọi yêu cầu sẽ cố gắng để lấy 'favicon.ico' quá. – alex

0

Bạn có thể bỏ qua các yêu cầu cho 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(); 

});