Node.js使用http模块搭建服务,访问一次却输出两次日志是什么原因?
问题原因
这是Chrome浏览器的默认行为导致的,你在地址栏输入地址访问时,浏览器会先后发起两次请求:
- 第一次是你主动发起的对
localhost:3000根路径的页面资源请求 - 第二次是浏览器自动发起的对
/favicon.ico网站图标文件的请求,用来在地址栏、标签页左侧显示站点专属图标,就算你站点没有提供这个资源,浏览器也会默认发送一次请求尝试获取
你当前的代码没有对请求路径做判断,所有路径的请求进入逻辑都会打印Incoming,因此两次请求就会对应两次控制台输出。
验证方案
你可以修改代码打印请求路径,直接验证该结论:
const http = require('http') const server = http.createServer((req, res) => { // 新增打印请求路径的逻辑 console.log('Incoming request path:', req.url) res.setHeader('Content-Type', 'text/plain') console.log('Incoming') res.write("Hello world, request granted!") res.end() }) server.listen(3000, 'localhost', () => { console.log("Listening for requests on port 3000") })
重启服务后再次访问,控制台会打印两次请求路径,第一次为/,第二次为/favicon.ico。
解决方案
如果要避免多余的打印,只需要在逻辑中过滤掉/favicon.ico的请求即可:
const http = require('http') const server = http.createServer((req, res) => { // 过滤站点图标请求 if(req.url === '/favicon.ico') { res.end() return } res.setHeader('Content-Type', 'text/plain') console.log('Incoming') res.write("Hello world, request granted!") res.end() }) server.listen(3000, 'localhost', () => { console.log("Listening for requests on port 3000") })
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

