部署你的第一个 Cloudflare Worker

CloudflareBeginner
立即练习

简介

健康检查端点是一个用于确认应用是否正常响应的小型 URL。在本实验中,你将编写一个 JavaScript Cloudflare Worker,在 LabEx 中测试其 JSON 响应,将相同的代码发布到公开的 workers.dev URL,查看一条请求日志,然后删除测试部署。

请使用已验证邮箱且启用了 Workers Free 的个人学习账号。该账号应已按照 准备 Cloudflare 学习账号 中的说明完成准备。你应该已经在 将 LabEx 连接到 Cloudflare 账号 中了解设备授权流程,并掌握基础 JavaScript 知识。这台全新的 VM 需要单独完成授权,并获得部署和删除 Worker 的权限。不需要购买域名、数据库或付费升级。你的测试响应是公开的,其中只包含示例数据。

环境已在 /home/labex/project/first-worker 中安装 Node.js 22.22.0 和项目本地的 Wrangler 4.131.1。你将使用 Wrangler 查看账号信息,并使用 curl 测试响应;这些工具也可以在 LabEx 外部使用。你需要自行编写 Worker 和配置文件,并运行标准的 Wrangler 命令。请保持这台 VM 开启,直到确认删除和退出登录都已完成。

编写健康检查 Worker

在本步骤中,你将创建 JavaScript 入口文件,并告诉 Wrangler 如何运行它。Worker 会导出一个 fetch 处理程序:Cloudflare 收到传入的 HTTP 请求后会调用它,而该处理程序返回的 Response 就会成为 HTTP 响应。这个初始 Worker 对所有路径都返回相同的健康检查消息;路由将在下一实验中介绍。

进入已准备好的项目目录,并检查 CLI 版本:

cd /home/labex/project/first-worker
npx wrangler --version

版本应为 4.131.1。Wrangler 是项目依赖,因此请从该目录运行命令。在你自己的计算机上,如果项目提供了锁定文件,应使用 npm ci 安装项目固定版本的依赖。

下一个命令使用 here-documentcat 会将 <<'WORKER'WORKER 之间的内容写入 src/index.js> 会替换该文件。对分隔符加引号可以防止 shell 修改其中的 JavaScript 文本。请粘贴完整代码块,包括最后一行分隔符。

cat > src/index.js <<'WORKER'
export default {
  async fetch(request) {
    console.log("health-request", request.method, new URL(request.url).pathname);
    return Response.json({ service: "labex-first-worker", status: "ok" });
  },
};
WORKER

Response.json 会创建状态码为 200、内容类型为 JSON 的响应。控制台消息会记录请求方法和路径,但不会记录请求头或凭据。

生成一个唯一名称,避免覆盖已有的 Worker。Node.js 内置的 crypto 模块会生成 6 个随机字节,并将其格式化为 12 个十六进制字符。$(...) 会将这段文本保存到 shell 变量中:

WORKER_NAME="labex-first-$(node -p "require('node:crypto').randomBytes(6).toString('hex')")"

创建配置文件。这里的分隔符没有加引号,因此 $WORKER_NAME 会展开为刚生成的唯一值:

cat > wrangler.jsonc <<CONFIG
{
  "name": "$WORKER_NAME",
  "main": "src/index.js",
  "compatibility_date": "2026-09-14",
  "workers_dev": true,
  "preview_urls": false
}
CONFIG

main 用于指定 JavaScript 文件。compatibility_date 用于选择运行时兼容行为;它不是部署时间戳。workers_dev 会启用公开的测试 URL,preview_urls 会禁用额外的版本预览 URL。没有注释的 JSON 也是有效的 JSONC;在本实验中请使用上面所示的格式。

cat wrangler.jsonc

确认名称以 labex-first- 开头,并包含唯一后缀。在整个实验中都保留这个名称:部署和删除操作都会针对它。完成授权后,你将在配置中添加账号 ID。

使用本步骤的验证按钮检查配置和处理程序。下一步骤中,你将通过本地运行时自行观察响应。

在本地运行并测试 Worker

在本步骤中,你将在发布 Worker 前先在 VM 中运行它。Wrangler 的本地运行时会执行你的处理程序,但不会创建云端部署。

在后台启动开发服务器,以便在同一个终端中发送 HTTP 请求。--ip 0.0.0.0 会使 VM 中的服务可供 LabEx Web 界面访问,--port 8080 会指定端口。> local.log 会保存标准输出,2>&1 会将错误发送到同一个文件,& 会在服务器运行期间返回命令行提示符。

npx wrangler dev --ip 0.0.0.0 --port 8080 > local.log 2>&1 &
cat local.log

等待日志显示服务器已在端口 8080 上准备就绪。如果启动仍在进行,请再次运行 cat local.log,然后再继续。直到本步骤结束前,请保持服务器运行。

使用 curl 发送请求。-i 会包含响应头,因此你可以同时检查状态码和内容类型:

curl -i http://127.0.0.1:8080/health

响应应包含以下稳定值;响应头的顺序和大小写可能不同:

HTTP/1.1 200 OK
Content-Type: application/json
...
{"service":"labex-first-worker","status":"ok"}

地址 127.0.0.1 指向这台 VM。它不是你的计算机,也不是公开的 Cloudflare 部署。继续之前,请检查 HTTP 状态码、JSON 内容类型以及响应中的两个字段。

请在开发服务器仍运行时完成本步骤的验证。

授权并部署到 Cloudflare

在本步骤中,你将把这台 VM 连接到学习账号,并部署已经测试过的 Worker。先查看后台任务。jobs 会列出在当前终端中启动的任务;其中应显示 wrangler dev

jobs

使用 kill %1 停止该任务。这里的 %1 表示当前终端中的任务 1,而不是系统进程 ID。如果 jobs 显示 wrangler dev 使用了其他编号,请改用该编号。这会向任务发送终止信号。

kill %1

开始设备授权。读取范围用于识别你的账号;workers_scripts:write 允许部署和删除脚本,workers_tail:read 允许查看实时日志。--browser=false 会打印链接,让你在自己的浏览器中打开。

npx wrangler login --device --browser=false --scopes account:read user:read workers_scripts:write workers_tail:read

打开显示的链接;如果 Cloudflare 要求登录,请先登录,然后输入当前设备代码并查看 Wrangler 请求的权限。选择你的学习账号,不要选择所有账号。授权页面还会包含必需的 Background Access。确认应用、账号和权限无误后,再批准授权;然后返回终端并等待授权完成。如果代码过期,请重新运行登录命令以获取新代码。不要将令牌粘贴到终端,也不要分享凭据文件。

展开 Account & BillingDeveloper Platform,查看下面显示的权限名称。这些权限比只读连接实验中的权限更广,因为本实验需要部署 Worker 并打开其实时日志。

用于 Worker 部署和实时日志的 Wrangler 权限列表

确认已选择你的学习账号。如果选择了错误的账号或所有账号,请使用 Edit 修改;点击 Authorize 前再次检查选择结果。

Authorize 按钮上方已选择学习账号

查看此次登录可用的账号:

npx wrangler whoami --json

确认 "loggedIn": true"authType": "OAuth Token"。在 accounts 数组中找到 name 与你的学习账号名称相符的对象,并复制其中 32 个字符的 id。本实验不需要其他账号设置。如果只显示一个账号,也要确认其名称;如果显示多个账号,请使用 Dashboard 区分它们。如果缺少你的账号,请使用目标账号重新完成授权。

account_id 添加到配置中。运行下面的代码块前,将其中的 YOUR_ACCOUNT_ID 替换为刚才复制的 ID。此操作会重写配置,同时保留步骤 1 中的 $WORKER_NAME 变量。请保持此终端开启;如果变量已丢失,请通过 cat wrangler.jsonc 读取原始名称,并先将 WORKER_NAME 恢复为完全相同的名称。部署后不要重新生成名称,也不要更换账号。

cat > wrangler.jsonc <<CONFIG
{
  "name": "$WORKER_NAME",
  "main": "src/index.js",
  "compatibility_date": "2026-09-14",
  "workers_dev": true,
  "preview_urls": false,
  "account_id": "YOUR_ACCOUNT_ID"
}
CONFIG
cat wrangler.jsonc

检查唯一的 Worker 名称,并将 account_idwhoami --json 输出中目标账号对象的 ID 进行比较。该 ID 是配置项,不是密码。部署和删除时,Wrangler 会读取它。现在发布本地源代码:

npx wrangler deploy

如果此账号还没有 workers.dev 子域名,Wrangler 会询问是否注册一个。回答 yes,使用字母、数字和连字符选择一个可用的小写名称,然后确认。这个账号级名称会由你未来的 Worker 共享,与本实验的唯一 Worker 名称不同。如果子域名已经存在,请继续使用它,不要重命名。不需要购买自定义域名或升级套餐。

等待部署完成。Wrangler 会打印一个符合以下结构的 URL:

https://<your-worker-name>.<your-subdomain>.workers.dev

将部署命令实际打印的 URL 复制到 shell 变量中。替换下面示例中的完整 URL,保留引号,并省略末尾的斜杠:

WORKER_URL="https://YOUR_WORKER.YOUR_SUBDOMAIN.workers.dev"
curl -i "$WORKER_URL/health"

预期结果是 HTTP 200,以及与本地测试相同的 JSON。如果新主机名仍在传播,请稍等片刻后重试;错误页面不表示部署成功。你也可以在浏览器中打开实际的 /health URL。如果浏览器或网络阻止访问 workers.dev,请使用 VM 中的 curl 结果;不要关闭浏览器安全设置。VM 请求和下面的独立检查都是必需的响应测试。

现在在 Cloudflare Dashboard 中直观确认同一个部署。保持终端开启。

在账号切换器中选择你的学习账号。该账号的身份必须与上面选择的账号一致。

打开 Compute → Workers & Pages。如有需要,刷新应用列表,然后找到配置中的完整 labex-first-... 名称。如果应用很多,请搜索完整名称。

打开该 Worker。确认其名称,并找到它的 workers.dev 地址;将该地址与 wrangler deploy 打印的 URL 进行比较。

已部署的实验 Worker 出现在 Workers and Pages 应用列表中

Worker 详情显示已部署的应用及其 workers.dev 地址

这些截图展示的是一个部署示例。你的随机 Worker 后缀和账号子域名会不同。请查找你自己的值,不要复制示例。如果找不到 Worker,请先检查所选账号、完整名称以及部署命令是否已经完成。

应用列表确认云资源存在;你通过 curl 测试的 HTTP 响应确认其代码正常运行。你不需要截取或提交自己的截图。

使用本步骤的验证按钮。验证后端会独立读取所选账号中的 Worker 设置,并测试公开端点,因此其他网站返回的相似文本无法通过验证。

查看实时请求日志

在本步骤中,你将连接实时日志流,并找到处理程序生成的消息。日志流只显示连接期间收到的请求,不会重放连接前的请求。

在后台启动 Wrangler tail。--format json 会生成结构化事件。这次将标准输出和错误分别写入不同文件,避免诊断文本混入事件数据:

npx wrangler tail --format json > requests.json 2> tail-errors.log &

等待几秒,让连接完成初始化,然后发送一个新请求:

curl -i "$WORKER_URL/health"

事件文件还包含大量请求元数据。head -n 32 会显示前 32 行,方便你关注第一个事件和应用消息:

head -n 32 requests.json

查找满足以下条件的事件:outcome 等于 ok;请求方法为 GET 且路径以 /health 结尾;控制台消息包含 health-request。其他字段、时间戳和请求头可能不同。如果文件为空,请查看 tail-errors.log,等待连接建立,重新发送请求,然后再次读取该文件。

在验证保存的完整事件之前停止 tail。查看 jobs,并使用其中显示的 wrangler tail 编号(前一个任务停止后,通常为 1):

jobs
kill %1

使用本步骤的验证按钮,检查捕获的事件是否来自已部署的 Worker。

文件中可能包含请求元数据。请将其保留在这台 VM 中;不要将其作为截图发布,也不要提交到公开代码仓库。

删除测试 Worker

在本步骤中,你将只删除测试 Worker,并在管理授权仍然有效时确认删除结果。删除 VM 不会删除已部署的 Worker。

再次检查项目配置,并确认其 name 是本实验中使用的唯一 labex-first-... 名称:

cat wrangler.jsonc

使用项目配置删除该 Worker:

npx wrangler delete

阅读确认提示,检查完整名称,然后按 y 确认。不要使用强制删除,也不要删除其他项目。Wrangler 通常会报告 Worker 已删除。使用固定版本和这些限定权限时,删除 Worker 后,它可能会针对 /storage/kv/namespaces 打印身份验证错误:Wrangler 还会在清理过程中检查旧版 Workers Sites 存储。本实验不会创建 KV 命名空间。不要授予所有建议的权限,也不要为了修复该诊断信息而重复部署;请使用本步骤的验证按钮确认 Worker 是否确实已删除。其他任何错误仍需调查。

在 Cloudflare Dashboard 中,进入学习账号下的 Workers & Pages 并刷新列表。确认完整的 Worker 名称已不存在。然后使用本步骤的验证按钮执行独立的 API 检查。

检查要求成功返回经过身份验证的资源清单;网络请求失败或登录已过期都不算删除成功。你的学习账号及其账号级 workers.dev 子域名仍可用于后续实验。退出登录前,请完成本步骤的验证。

断开 VM 连接

在本步骤中,你将在确认云端清理完成后,删除 Wrangler 保存的授权信息。本地源文件仍会保留在 VM 中,但这些文件不再能够授权访问你的账号。

npx wrangler logout
npx wrangler whoami --json

查找 "loggedIn": false。退出登录后,此版本的 Wrangler 会以非零状态退出;这是预期行为。没有显示这一明确状态的网络错误不能证明已经退出登录。使用本步骤的验证按钮进行独立确认。

你的浏览器可以继续保持 Cloudflare Dashboard 的登录状态。浏览器登录与这台 VM 的 Wrangler 授权彼此独立。后续实验会从全新的 VM 开始,并要求重新完成授权。

总结

你编写了 Worker fetch 处理程序和配置文件,在本地测试了它的 JSON 响应,将其部署到自己的学习账号,并查看了实时请求日志。你独立验证了公开响应和资源归属,在保持授权的情况下删除了测试 Worker,并退出了 VM 的登录状态。

如需参考,请查看 Cloudflare 的 Wrangler 命令fetch 处理程序workers.dev 配置