最后更新:2026-02-27
Error: listen EACCES: permission denied :::5173
Error: listen EACCES: permission denied :::8080
vite.config.ts 中使用了 IPv6 host 配置:host: "::"
Windows 上 IPv6 绑定权限比 IPv4 更严格,某些端口范围在 IPv6 下会直接被拒绝访问。
将 vite.config.ts 中的 host 改为 IPv4:
// frontend/vite.config.ts
server: {
host: "localhost", // 或 "127.0.0.1",不要用 "::"
port: 5173,
}ERROR: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
某些端口(8000、8002、8888)报错,换其他端口(如 9000)可以。
Windows 的 Hyper-V 和 WSL2 会保留一系列端口段,普通进程无法绑定这些端口。
查看保留范围:
netsh int ipv4 show excludedportrange protocol=tcp典型保留范围示例:
| 起始端口 | 结束端口 | 受影响的常用端口 |
|---|---|---|
| 7997 | 8096 | 8000, 8002, 8080 |
| 8819 | 8918 | 8888 |
Tun 模式会安装虚拟网卡并接管所有网络流量,导致非管理员权限的进程无法 bind() 任何 TCP socket。
方案 A:换端口(推荐) 使用不在保留范围内的端口,如 9000:
# 启动命令
python -m uvicorn backend.app:app --reload --port 9000方案 B:关闭 Clash Verge Tun 模式 关闭 Tun 模式(保留系统代理即可),然后重试启动。
方案 C:以管理员身份运行 管理员权限下可以绑定被 Hyper-V 保留的端口。
# 检查是否有代理/VPN进程
Get-Process | Where-Object {$_.Name -match "clash|v2ray|proxifier|fiddler|wireguard|vpn"}
# 验证端口是否被占用(WinError 10013 ≠ 端口占用)
netstat -ano | findstr ":8000"
# 验证端口排除范围(Hyper-V会保留一段端口)
netsh int ipv4 show excludedportrange protocol=tcp
# 直接测试socket是否能绑定
python -c "import socket; s=socket.socket(); s.bind(('127.0.0.1',9000)); print('OK'); s.close()"注意:WinError 10013 ≠ 端口被占用(10048 才是端口被占用)。10013 是权限拒绝。
INFO: 127.0.0.1:xxxx - "OPTIONS /api/chat HTTP/1.1" 400 Bad Request
INFO: 127.0.0.1:xxxx - "OPTIONS /api/chat HTTP/1.1" 405 Method Not Allowed
前后端服务都起来了,但前端发请求时浏览器先发 CORS preflight,被后端拒绝。
- Origin 不匹配:
127.0.0.1:5173和localhost:5173在 CORS 中被视为不同的 origin - OPTIONS 方法未处理:FastAPI 的 CORSMiddleware 默认应该处理 OPTIONS,但有时需要显式配置
步骤 1:vite.config.ts 使用 localhost
// frontend/vite.config.ts
server: {
host: "localhost", // 统一用 localhost
port: 5173,
}步骤 2:后端 CORS 白名单完整配置
# backend/app.py
app.add_middleware(
CORSMiddleware,
allow_origins=[
"http://localhost:3000",
"http://localhost:5173",
"http://127.0.0.1:5173", # 兜底
],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
expose_headers=["*"],
)步骤 3:显式添加 OPTIONS 处理器(兜底)
# backend/app.py
from starlette.responses import Response
@app.options("/api/chat")
@app.options("/api/sessions")
@app.options("/api/files")
def options_handler():
return Response(status_code=200, headers={
"Access-Control-Allow-Origin": "http://localhost:5173",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "*",
"Access-Control-Allow-Credentials": "true",
})- 浏览器 DevTools → Network → 找 OPTIONS 请求 → 看
Origin请求头是什么 - 和后端
allow_origins做精确对比(含协议、主机名、端口) 127.0.0.1≠localhost,两者都要加,或统一用其中一个
# ========================================
# 终端 1:启动后端(在项目根目录执行)
# ========================================
cd F:\vibe_coding_study\mini-openclaw
conda activate langgraph
python -m uvicorn backend.app:app --reload --port 9000
# 后端启动成功后显示:
# INFO: Uvicorn running on http://127.0.0.1:9000
# 访问 Swagger UI: http://localhost:9000/docs
# ========================================
# 终端 2:启动前端(在 frontend 目录执行)
# ========================================
cd F:\vibe_coding_study\mini-openclaw\frontend
npm run dev
# 前端启动成功后显示:
# ➜ Local: http://localhost:5173/| 服务 | 地址 | 说明 |
|---|---|---|
| 前端应用 | http://localhost:5173 | 主界面 |
| 后端 API | http://localhost:9000 | FastAPI 服务 |
| Swagger 文档 | http://localhost:9000/docs | API 调试界面 |
| 服务 | 当前端口 | 说明 |
|---|---|---|
| 后端 FastAPI | 9000 | 原定 8002,因 Windows Hyper-V 保留范围改用 9000 |
| 前端 Vite | 5173 | 默认端口 |
| 文件 | 作用 | 当前值 |
|---|---|---|
backend/app.py |
CORS 配置、API 端点 | 允许 localhost:5173 和 127.0.0.1:5173 |
frontend/vite.config.ts |
Vite server 配置 | host: "localhost", port: 5173 |
frontend/src/api.ts |
前端 API 地址 | API_BASE = 'http://localhost:9000' |
backend/.env |
LLM 配置 | API Key、模型名等 |
如果需要更换端口,请确保修改以下三处并保持一致:
- 后端启动命令:
--port XXXX - 前端 api.ts:
API_BASE = 'http://localhost:XXXX' - 后端 CORS 白名单:添加新端口的 origin(如果不是标准端口)
backend/app.py 中 Pyre2 报 Cannot find import of fastapi 等错误——这是 IDE 没有配置 conda langgraph 环境路径导致的,不影响实际运行。
解决方法:VSCode 中 Ctrl+Shift+P → Python: Select Interpreter → 选择 langgraph conda 环境。