2012-07-06 82 views
4

我想知道是否有人可以帮助我理解以下行为。如果我有一个的node.js服务器上的文件app.js如下面:Node.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我会理解它每次都添加到同一个变量中,但是我希望它每次都以3的倍数打印结果,所以第一次打印总共打印3行,第二次打印6,第三次打印9等

我对node.js很新,所以如果有人能解释这种行为或如何循环以我不会期望的方式工作,将不胜感激

谢谢

回答

3

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

您的浏览器将作出HTTP请求/favicon.ico,这将在打你的脚本,并增加了3线到每个请求的x变量。

  1. 刷新页面并看到3行。
  2. 您的浏览器请求/favicon.ico,并添加3条额外的线
  3. 您刷新页面,并看到6行+ 3个附加。
  4. 您的浏览器请求/favicon.ico,和3个附加行添加

...等

您可以通过检查favicon.ico结束request.url参数来解决这个问题;

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

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

if (require('url').parse(request.url).pathname === '/favicon.ico') { 
    // don't incremement. 
} 
+0

这听起来合理做更害怕,随手,但它仍然没有解释为什么仅环显示了前3个结果请求。当然也应该解雇/favicon.ico请求? – TommyBs 2012-07-06 13:08:54

+1

@TommyBs:不,因为对于你看到的实际页面的HTTP请求已经完成,对'/ favicon.ico'的请求发生。 – Matt 2012-07-06 13:10:44

+1

是的,它看起来像你是正确的。我现在明白你对favicon的意思。在理论上,第一个请求添加了favicon,但没有显示,因为它没有再次打到服务器。我做了一个“request.url”的console.log文件,它证实了你的怀疑。感谢您及时的回复。我想除了检查请求之外,没有办法解决这个问题。当然不是问题!只是学习 – TommyBs 2012-07-06 13:13:09