You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:22:14