4

誰かが私が次の行動を理解するのを手伝ってくれるかどうか疑問に思っています。以下のようなnode.jsサーバーにapp.jsファイルがある場合:

var http = require('http');
var _ = require('underscore');

http.createServer(function(request, response) {
var x = '';
    _.each([1, 2, 3], function(num){
    x +=" underscore.js says " + num;
});
    response.writeHead(200, {
        'Content-Type': 'text/html'
    })

    response.end(x);

      }).listen(3000, null);

その後、ページをリクエストするたびに、「underscore.jssayx」というテキストが3回表示されます。ループには3つの数字があり、リクエストごとにxがリセットされるため、これを期待しています。ただし、次の場合(xはcreateServerのコールバックの外に移動します):

var http = require('http');
var _ = require('underscore');
var x = ''; // Note x is moved outside the createserver callback
http.createServer(function(request, response) {

    _.each([1, 2, 3], function(num){
    x +=" underscore.js says " + num;
});
    response.writeHead(200, {
        'Content-Type': 'text/html'
    })

    response.end(x);

      }).listen(3000, null);

最初のロードでは(予想どおり)3つの結果が生成されますが、後続のリクエストでは常にループが2回追加されます(したがって、6つの "underscore.jsはx"行を示します。同じ変数に毎回追加されることは理解できますが、結果を毎回3の倍数で印刷するため、最初の呼び出しでは合計3行、2番目の印刷では6行、3番目の印刷では9行などが印刷されます。

私はnode.jsを初めて使用するので、誰かがこの動作や、このループが予期しない方法でどのように機能しているかを説明していただければ幸いです。

ありがとう

4

1 に答える 1

3

これはおそらく残念な答えですが、それでもです。

ブラウザはにHTTPリクエストを送信します。これにより、スクリプトがヒットし、リクエストごとに変数に/favicon.ico3行が追加されます。x

  1. ページを更新すると、3行が表示されます。
  2. ブラウザが要求/favicon.icoし、3行が追加されます
  3. ページを更新すると、6行+3行が追加されます。
  4. ブラウザが要求/favicon.icoし、3行が追加されます

...など。

;request.urlで終わるパラメータをチェックすることでこれを修正することができます。favicon.ico

if (/\/favicon.ico$/.test(request.url)) {
    // don't incremement
}

...または、モジュールを使用してよりファンクにそれを行うことができます。url()

if (require('url').parse(request.url).pathname === '/favicon.ico') {
    // don't incremement.
}
于 2012-07-06T13:06:23.497 に答える