好的,现在请你总结一下我们整个的安装设计部署过程。我希望包括:1、安装过程中可能出错以及遇到的问题和最终的解决办法;2、设计开发过程中可能出错的地方,以及遇到的问题和最终的解决方案;3、测试部署过程中可能出错的地方,以及遇到的问题和最终的解决方案。尽可能的详细,便于将来回顾。
很高兴为你总结我们这次从头到尾的合作过程。这个总结将涵盖你在各个阶段可能遇到的问题、原因以及我们最终找到的解决方案。
1. 安装阶段:环境与依赖
这个阶段的主要挑战是让你的 VPS 环境准备好运行 npm 和 wrangler,并成功安装项目依赖。
- 问题 1:
npm install失败并显示Killed- 原因: 你的 VPS 内存或 CPU 资源不足,操作系统启动了 OOM Killer 机制,强制终止了
npm install进程。 - 解决方案: 增加 VPS 的 Swap 空间。我们通过创建和激活一个 Swap 文件,为系统提供了额外的虚拟内存,从而成功地让
npm install顺利完成。
- 原因: 你的 VPS 内存或 CPU 资源不足,操作系统启动了 OOM Killer 机制,强制终止了
- 问题 2:
npm install出现警告和漏洞提示- 原因: 依赖库本身存在已过时的版本或已知的安全漏洞。
- 解决方案: 忽略或选择性修复。对于你的项目而言,这些警告和漏洞不会影响 Worker 的功能。最直接的方案是忽略它们,继续进行部署。如果需要修复,可以通过
npm audit fix命令,但可能引入不兼容的变更。
- 问题 3:
npm install exceljs失败- 原因:
exceljs依赖于一些旧版本的peer dependencies,可能导致安装失败。 - 解决方案: 使用
npm install exceljs --legacy-peer-deps命令。这个标志会告诉npm忽略依赖版本冲突,从而强制完成安装。
- 原因:
2. 设计开发阶段:代码与配置
这个阶段的重点是配置 wrangler.jsonc 文件,并确保你的代码与它协同工作。
- 问题 1:
wrangler.jsonc配置错误- 原因:
wrangler配置格式有严格要求,常见的错误是字段不匹配。例如,zone_id应该是一个 ID 字符串而不是域名,routes对象中的rewrite和route_name等字段与字符串模式不兼容,custom_domain不能与路径一起使用。 - 解决方案: 严格遵循
wrangler文档和错误提示。最终我们找到了一个简洁的、仅包含模式字符串的routes配置,它能被wrangler正确解析。
- 原因:
- 问题 2:代码中
URL路径与路由不匹配- 原因: 你在
wrangler.jsonc中配置了子路径 (/assign-sub/*),但你的 Worker 代码期望/、/upload等根路径。 - 解决方案: 在 Worker 代码中处理 URL 重写。我们使用了
let pathname = url.pathname.replace(/^\/assign-sub(\/?)/, '/');语句,在代码中将assign-sub子路径移除,确保你的switch语句能正确处理重写后的路径。
- 原因: 你在
- 问题 3:HTML 表单路径问题
- 原因: HTML 表单
action属性的相对路径解析行为与预期不同,导致表单被提交到错误的 URL。例如,./submit-password被浏览器解析为https://wintendo.cloudns.biz/submit-password,而不是https://wintendo.cloudns.biz/assign-sub/submit-password。 - 解决方案: 使用
assign-sub/submit-password这种相对路径。这种路径的解析方式能确保 URL 中包含assign-sub前缀,从而被wrangler的路由正确捕获。
- 原因: HTML 表单
3. 测试与部署阶段:验证与上线
这个阶段的挑战是将本地开发环境与线上生产环境进行同步,并验证其功能。
- 问题 1:
wrangler dev本地测试时,文件无法上传到 R2- 原因:
wrangler dev默认在本地模拟 R2 服务,并不会连接到你的线上 R2 Bucket。 - 解决方案: 直接部署到生产环境。本地测试用于验证代码逻辑,线上部署才能验证与 Cloudflare 服务的实际交互。
- 原因:
- 问题 2:部署成功但 Worker URL 消失
- 原因: 在
wrangler.jsonc中添加了"workers_dev": false,明确告诉wrangler不再为你的 Worker 创建免费的workers.dev子域名。 - 解决方案: 在 Cloudflare Dashboard 中手动添加自定义域名路由。通过配置路由,你将 Worker 挂载到自己的域名上,而不是依赖于
workers.dev。
- 原因: 在
- 问题 3:
wrangler.jsonc和 Cloudflare Dashboard 的路由不一致- 原因: 我们在本地配置了
routes,但在 Cloudflare 上却没有相应的路由。 - 解决方案: 以
wrangler.jsonc为唯一真理来源。将routes配置写在wrangler.jsonc中,然后通过wrangler deploy命令自动同步到 Cloudflare Dashboard,无需手动添加。
- 原因: 我们在本地配置了
最终的结论
你通过这次实践,不仅成功地部署了一个复杂的 Worker 应用,还深入理解了 Cloudflare 开发工作流中的核心问题。你所遇到的每一个问题,都是一个学习的机会,让你更好地掌握了 npm、wrangler 和 Cloudflare 的配置精髓。
1、前面submit-password和upload两个route路径如何设置应该重点说明;2、通过引入隧道方式,可以方便的实现在headless上的vps能够进行localhost方式的调试;
这两个方面的内容进一步补充
关于路径和隧道:最终总结与补充
1. 路径和路由的重点说明
在整个调试过程中,路径和路由是最大的难点。以下是最终确定的、最可靠的路径设置方案,也是我们之前所讨论的,但这次我将它总结得更加清晰。
你的 Worker 代码中的路径
在你的 index.ts 文件中,所有内部路由都应该被视为根路径。这是因为你的 Worker 代码会负责处理 URL 重写,将外部的复杂路径转换为内部的简单路径。
- 你的
switch语句应该处理的路径:/(用于显示密码输入页面)/submit-password(用于处理密码提交)/upload(用于处理文件上传)
你的 HTML 中的路径
这是最容易出错的地方。HTML 表单和链接的路径必须确保浏览器将请求正确发送到你的 Worker。
- 表单
action的路径:- 正确写法:
action="assign-sub/submit-password" - 为什么:这种相对路径写法,在浏览器看来,是基于
https://wintendo.cloudns.biz这个域名的根目录来解析。这确保了表单提交的 URL 总是https://wintendo.cloudns.biz/assign-sub/submit-password,从而被 Cloudflare 正确路由到你的 Worker。
- 正确写法:
fetchAPI 的路径:- 正确写法:
fetch('./upload') - 为什么:
fetchAPI 的./前缀是相对于当前页面 URL 来解析的。当页面 URL 是https://wintendo.cloudns.biz/assign-sub时,./upload会被正确解析为https://wintendo.cloudns.biz/assign-sub/upload。
- 正确写法:
wrangler.jsonc 中的路由
你的本地配置文件只需要声明 Cloudflare 需要监听哪些模式的 URL,以确保它们能够被路由到你的 Worker。
- 正确配置:JSON
"routes": [ "wintendo.cloudns.biz/assign-sub/*", "wintendo.cloudns.biz/assign-sub" ] - 为什么:这个配置告诉 Wrangler,将所有以
assign-sub开头的请求(包括带斜杠和不带斜杠的)都发送给你的 Worker。
2. 关于 SSH 隧道:本地测试的利器
你使用 SSH 隧道来解决在无头 VPS 上进行本地调试的问题,这是一个非常实用的技巧,值得重点强调。
如何工作
SSH 隧道本质上是创建了一个加密的通道,将本地机器上的端口转发到远程服务器(你的 VPS)上的端口。
- 在 VPS 上:你运行
wrangler dev,它启动一个本地 Web 服务器,监听localhost:8787。这个服务器只能被 VPS 内部访问。 - 在你的电脑上:你运行
ssh -L 8787:localhost:8787 ...。这个命令创建了一个隧道,告诉你的电脑:“任何发送到我本地8787端口的请求,都通过 SSH 隧道转发到 VPS 的localhost:8787。” - 在浏览器中:当你访问
http://localhost:8787时,浏览器将请求发送给你的本地电脑。你的电脑通过 SSH 隧道,将请求秘密地发送到你的 VPS,由wrangler dev服务来处理。
为什么要这样做
- 无需部署即可测试:它允许你在代码更改后立即测试,无需等待
wrangler deploy的过程,极大地提高了开发效率。 - 模拟生产环境:你可以在一个与生产环境(Linux VPS)相似的环境中测试,减少因操作系统差异而产生的问题。
- 绕过网络限制:由于整个过程是通过 SSH 隧道进行的,即使 VPS 的防火墙阻止了外部对
8787端口的访问,你也可以安全地进行本地调试。
通过这种方式,你成功地克服了无头 VPS 的局限性,实现了高效、安全的本地开发工作流。