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.js say 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,第三次打印 9,依此类推。

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

谢谢

4

1 回答 1

3

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

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

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

... ETC。

您可以通过检查以;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 回答