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

我想知道如果有人能帮助我理解以下行为。 如果我在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的callback之外):

 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行”,我可以理解它每次都附加到同一个variables,但是我希望它会每次打印结果为3的倍数,所以首先打印总共3行,第二个打印6,第三个打印9等。

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

谢谢

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

您的浏览器将向/favicon.ico发出一个HTTP请求,该请求将/favicon.ico您的脚本,并为每个请求添加另外3行到您的xvariables。

  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 } 

…或者你可以做更多的funk-ily与url()模块;

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