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

Windows10(WSL2后端)Docker运行Node.js时单浏览器请求触发两次响应

问题:浏览器访问Node.js服务触发两次请求的原因?

正在学习Manning出版社的《Kubernetes in Action》一书,在第28页的Docker运行Node.js练习中遇到异常:使用Windows10系统搭配WSL2后端的Docker for Windows,部署的Node.js服务代码如下:

// Sample program for "Kubernetes in Action", page 28
const http = require('http');
const os = require('os');

// Console output doesn't show when the "docker run ... -d ..." option is used.
console.log("Kubia server starting...");

// For some reason the handler is called twice for each localhost:8080
var handler = function(request, response) {
    var dt = new Date();
    var dtString = dt.toISOString();
    console.log("Received request from " + request.connection.remoteAddress + " at " + dtString);
    response.writeHead(200);
    response.end("You've hit " + os.hostname() + " at " + dtString + "\n");
};

var www = http.createServer(handler);
www.listen(8080);

Dockerfile配置为:

FROM node:12.18.1
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]

执行docker build -t kubia .构建镜像,docker run --name kubia-container -p 8080:8080 kubia启动容器后,通过浏览器访问localhost:8080时,控制台显示服务处理了两次请求,但浏览器仅接收一次响应;使用curl请求时,服务仅处理一次请求。


解答

这是浏览器的默认行为导致的:当你在浏览器地址栏输入URL访问时,浏览器除了请求你指定的根路径(/),还会自动发起一个额外的/favicon.ico请求,用来获取网站的图标(favicon)。而你的Node.js服务没有针对/favicon.ico路径做特殊处理,所以这个请求会被同一个handler处理,导致控制台打印两次请求日志。

curl作为命令行工具,只会严格执行你指定的请求(即仅请求根路径/),所以只会触发一次服务处理。

你可以在handler函数中添加一行代码打印请求路径,验证这个结论:

console.log("Request URL: " + request.url);

此时控制台会输出两次请求的URL,分别是/和/favicon.ico。


内容的提问来源于stack exchange,提问作者Jerome M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:06:17