Python本地服务器拒绝JS请求问题排查求助
问题分析与解决方案
问题根源
错误connect ECONNREFUSED ::1:8080说明Node.js的fetch请求尝试通过**IPv6地址::1**连接服务器,但你的Python服务器只监听了IPv4地址,导致连接被拒绝:
- 浏览器访问正常:浏览器会自动尝试IPv4/IPv6的 fallback,当IPv6连接失败时会切换到IPv4的
127.0.0.1 - JS服务器能正常响应:Node.js的
http.createServer默认会同时监听IPv4和IPv6地址,所以不管请求用哪个协议都能命中 - Python服务器的问题:
socketserver.TCPServer绑定("", 8080)时,在Windows系统下默认只监听IPv4的0.0.0.0,不会监听IPv6的::
解决方案(二选一即可)
方案1:修改Python服务器,同时支持IPv4和IPv6
修改服务器绑定的地址为::,并开启地址复用:
import http.server import socketserver import json def open_server(handler, PORT=8080): # 绑定到IPv6地址::,同时兼容IPv4请求 httpd = socketserver.TCPServer(("::", PORT), handler) # 允许地址复用,避免重启服务器时端口占用报错 httpd.allow_reuse_address = True print("serving at port", PORT) httpd.serve_forever() class api_handler(http.server.BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() self.wfile.write(json.dumps({"res1": "res1"}).encode("utf-8")) open_server(api_handler, PORT=8080)
方案2:修改JS请求地址为IPv4明确地址
把fetch的目标地址从http://localhost:8080改成http://127.0.0.1:8080,强制Node.js使用IPv4连接:
const getRes = async res => { console.log("getting res") try { const response = await fetch("http://127.0.0.1:8080", { method: "GET", headers: { "Content-Type": "application/json", }, }) if (response.status === 200){ console.log(response.status) const responseJson = await response.json() console.log(JSON.stringify(responseJson)) return responseJson } console.log(response.status) } catch (e) { console.log(e) } } getRes("res1")
内容的提问来源于stack exchange,提问作者WEASELS
相关产品推荐
相关产品推荐

