16

私はNode.jsを学んでおり、コードが重複したconsole.log出力を吐き出すが、単一のresponse.write出力しか吐き出さない「理由」を理解したいと思います。

私の簡単なコード例を次に示します。

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);

そして、コンソール/ターミナルで次のように表示されます:

こんにちは 1

こんにちは 2

こんにちは 1

こんにちは 2

ありがとう。

4

6 に答える 6

25

一部のブラウザーは、favicon.icoファイルを見つけるための要求も送信します。ファイルはデフォルトでは存在しないため、ブラウザー (特にChrome ) は常に 2 つの要求を送信します。1 つは最初に要求されたファイルに対するもので、もう 1 つは favicon.ico に対するものです。これは Chrome の既知のバグであり、バージョン 29 で修正されています。ただし、 Firefoxは最初のリクエストでのみ favicon.ico をリクエストします。console.logURIパスをリクエストする場合は、次へのリクエストが表示される必要があります。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);
于 2013-07-30T16:52:05.100 に答える
2

私自身も同じ問題を抱えていましたが、次のようなものを使用していることがわかりました

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/");

その動作を回避するには十分です。何らかの理由で、req.url を確認して比較すると、'/favicon.ico'何もコンソールに送信されません。実際、そのブロック内のすべてが無視されます。この動作が想定されているかどうかはわかりませんが、試してみてください。

于 2014-05-01T01:26:00.130 に答える
1

ヘッダーを出力すると、ファビコンが見つかったことをサーバーに伝えているため、応答が処理され、その double を取得しても処理されますconsole.log()。代わりに、送信する前に終了するwriteHead()か、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();
}
于 2013-10-23T10:48:13.347 に答える
1

この問題は chrome バージョン 67.0.3396.87 (32-bit) でも解決しないと思いますconsole.log() ステートメントを 1 回だけ表示するための私のコードは、単純でした。コードとすべてが正常に機能しました

前のコード

var http = require('http');
var url = require('url');
http.createServer((request,response)=>{
var q = url.parse(request.url,true).query;
console.log(request.url);
console.log('hey there! we got a request from '+q.name+' !');
}).listen(8080);

出力は次のとおりです。

/?name=harshit
hey there we got a request from harshit !
/favicon.ico
hey there we got a request from undefined !

デバッグ後のコード:

var http = require('http');
var url = require('url');
http.createServer((request,response)=>{
if(request.url == "/favicon.ico"){
return ;
}
var q = url.parse(request.url,true).query;
console.log(request.url);
console.log('hey there! we got a request from '+q.name+' !');
}).listen(8080);    

出力:

/?name=harshit
hey there we got a request from : harshit !
于 2018-06-19T06:43:08.477 に答える