为何http.createServer的回调函数会执行两次?
为什么Node.js简易服务器单次刷新页面会触发两次回调?
我正在学习Node.js,编写了如下简易服务器代码:
const http=require('http'); const server=http.createServer((request,respond)=>{ console.log('here'); if(request.url==='/'){ respond.write('hello world'); respond.end() } if(request.url==='/about'){ respond.write('about page'); respond.end() } }); console.log('here now'); server.listen(5000);
每次刷新页面时,console.log('here')都会打印两次,想知道为何单次刷新会触发两次回调执行?
这是因为浏览器在请求页面时,除了会请求你指定的页面资源(比如/或/about),还会自动发起一次对/favicon.ico的请求——这是浏览器的默认行为,用来获取网站的图标(favicon)。
你的服务器代码里没有处理/favicon.ico这个路径的请求,所以每次刷新时,浏览器会发送两次HTTP请求:一次是页面本身的请求,一次是favicon的请求,自然就触发了两次回调,打印两次here。
验证这个问题很简单,你可以在回调里打印request.url,就能看到两次请求的路径分别是什么。如果要解决这个问题,只需要添加对/favicon.ico请求的处理即可:
const http=require('http'); const server=http.createServer((request,respond)=>{ console.log('请求路径:', request.url); if(request.url==='/'){ respond.write('hello world'); respond.end() } if(request.url==='/about'){ respond.write('about page'); respond.end() } // 处理favicon请求,直接结束响应 if(request.url==='/favicon.ico'){ respond.end(); } }); console.log('here now'); server.listen(5000);
添加这段处理后,刷新页面就只会打印一次对应页面路径的日志了。
内容的提问来源于stack exchange,提问作者Techy Bhoot
相关产品推荐
相关产品推荐

