Node.js混淆了每个循环的输出

时间:2012-07-06 12:50:53

标签: node.js loops response

我想知道是否有人可以帮助我理解以下行为。如果我在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.js说x”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个结果(如预期的那样),但后续请求总是将循环附加两次(所以6“underscore.js表示x”行。我可以理解它每次都附加到同一个变量,但是我会期待它要以每次3的倍数打印出结果,所以第一次打印总共打印3行,第二次打印6,第3次打印9等。

我对node.js很新,所以如果有人可以解释这种行为或者这个循环是如何以我不希望的方式工作的话,我将不胜感激。

感谢

1 个答案:

答案 0 :(得分:3)

这可能是一个令人失望的答案,但仍然如此。

您的浏览器将向/favicon.ico发出HTTP请求,该请求将触及您的脚本,并为每个请求的x变量添加额外的3行。

  1. 您刷新页面并看到3行。
  2. 您的浏览器请求/favicon.ico,并添加了3行
  3. 您刷新页面,看到6行+ 3个附加。
  4. 您的浏览器请求/favicon.ico,并添加了3行
  5. ......等等。

    您可以通过选中以request.url结尾的favicon.ico参数来解决此问题;

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

    ...或者你可以使用url() module;

    更有趣地做到这一点
    if (require('url').parse(request.url).pathname === '/favicon.ico') {
        // don't incremement.
    }