2013-07-30 31 views
11

Tôi đang học Node.js và tôi muốn hiểu "tại sao" khi mã kích hoạt đầu ra console.log bị trùng lặp nhưng chỉ có một kết quả đầu ra response.write.Đầu ra console.log đôi Node.js

Heres đơn giản ví dụ mã của tôi:

var http = require('http'); 

http.createServer(function(request, response){ 
    response.writeHead(200, {'Content-type': 'text/plain'}); 
    console.log('hello 1'); 
    response.write('Hello world'); 
    console.log('hello 2'); 
    response.end(); 
}).listen(8000); 

Và trên giao diện điều khiển của tôi/terminal tôi nhận được:

chào 1

chào 2

chào 1

xin chào 2

Cảm ơn.

Trả lời

19

Một số trình duyệt cũng gửi yêu cầu để tìm tệp favicon.ico. Do tệp không có sẵn theo mặc định, nên một trình duyệt (Chrome nói riêng) sẽ luôn gửi hai yêu cầu: một cho tệp được yêu cầu ban đầu và một cho favicon.ico. Đây là known bug trong Chrome và đã được sửa trong phiên bản 29. Tuy nhiên, Firefox, chỉ yêu cầu cho favicon.ico đối với yêu cầu đầu tiên. Nếu bạn console.log yêu cầu URI đường, bạn phải thấy yêu cầu localhost:8000/favicon.ico.

var http = require('http'); 

http.createServer(function(request, response){ 
    response.writeHead(200, {'Content-type': 'text/plain'}); 
    if(request.url === '/favicon.ico') { 
     console.log('Favicon was requested'); 
    } 
    console.log('hello 1'); 
    response.write('Hello world'); 
    console.log('hello 2'); 
    response.end(); 
}).listen(8000); 
+0

Lạ. Có cách nào để ghi đè điều đó không? Hay nó là vấn đề "hút nó lên"? – JDillon522

+0

Bạn có thể 'response.end()' để ngăn xử lý yêu cầu của bạn không được thực thi theo yêu cầu tới favicon.'if (request.url === '/favicon.ico') {response.end(); } 'Không chắc chắn nếu có bất kỳ cách nào khác tồn tại. –

+1

@ JDillon522 có tiện ích mở rộng chrome để tắt nó. – SheetJS

0

Nếu bạn đầu ra tiêu đề bạn đang nói với máy chủ mà bạn tìm thấy favicon, vì thế mà phản ứng được xử lý và không có vấn đề gì bạn nhận được rằng đôi console.log(). Thay vào đó, kết thúc nó trước khi gửi một writeHead() hoặc gửi 404.

var http = require('http'); 

http.createServer(function (req, res) { 
    if(req.url === '/favicon.ico') { 
     res.writeHead(404); 
     res.end(); 
    } else { 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
    } 
    //code here... 

    res.end(); 
} 
2

Tôi đã có cùng một vấn đề bản thân mình, và tôi phát hiện ra rằng việc sử dụng một cái gì đó giống như

var http = require('http'); 
http.createServer(function(req,res) { 
    if(req.url === '/favicon.ico') 
    { 
     //everything here is ignored 
    } 
    res.writeHead(200,{"Content-Type": "text/plain"}); 
res.write("Hello World\n"); 
res.end(); 
console.log("Connection made"); 
}).listen(1337, "127.0.0.1"); 
console.log("Server running at http://127.0.0.1:1337/"); 

là đủ để tránh hành vi đó . Đối với một số lý do, khi tôi kiểm tra req.url và so sánh nó với '/favicon.ico' không có gì được gửi đến bảng điều khiển, trên thực tế, mọi thứ trong khối đó đều bị bỏ qua. Tôi không biết nếu hành vi này được mong đợi, nhưng bạn chắc chắn có thể thử nó.

0

trong một nutshell trùng lặp khi nó được đề cập trước đây là kết quả của yêu cầu favicon như vậy để tránh vấn đề này, tôi đề nghị bạn snipet đơn giản này:

var pathname = url.parse(request.url).pathname; 
if(pathname != '/favicon.ico') 
console.log('hello 1'); 
0

Nó cũng có thể là một plugin Chrome như JSONView . Tôi chỉ cố gắng tìm ra nó cho đến khi tôi thử ẩn danh và nhận ra nó không còn gây ra vấn đề nữa. Cũng đã yêu cầu một tệp JSON.

Các vấn đề liên quan