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
相关产品推荐
相关产品推荐

