我想知道是否有人可以帮我理解以下行为.如果我在node.js服务器上有app.js文件,如下所示: var http = require('http');var _ = require('underscore');http.createServer(function(request, response) {var x = ''; _.each
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很新,所以如果有人能够解释这种行为或者这个循环是如何以我不希望的方式工作的话,我将不胜感激.
谢谢
这可能是一个令人失望的答案,但仍然如此.您的浏览器将向/favicon.ico发出HTTP请求,该请求将命中您的脚本,并为每个请求的x变量添加额外的3行.
>您刷新页面并看到3行.
>您的浏览器请求/favicon.ico,并添加了3个额外的行
>您刷新页面,并看到另外3行的6行.
>您的浏览器请求/favicon.ico,并添加了3个额外的行
…等
你可以通过检查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. }