全球分布式 REST API 构建指南:Cloudflare Workers + Fauna 实战

作者:API传播员 · 2025-10-23 · 阅读时间:6分钟

确保您的应用程序在全球范围内的速度、可靠性和可访问性不再只是一个选择,而是一种必需品。通过结合使用 Cloudflare 的 CDN 和 Fauna 的全球分布式数据库,您可以轻松构建 REST API,从而在全球范围内提供卓越的速度、可靠性、低延迟和扩展性。Cloudflare Workers 和 Fauna 后端特别适合需要低延迟、全球分布和高扩展性的应用程序场景,例如实时数据分析平台、游戏后端、聊天应用程序、视频和音乐共享平台以及电子商务应用程序。本文将详细演示如何使用 Cloudflare Workers 和 Fauna 构建一个全球化的无服务器 REST API


学习目标

  • 掌握如何在 Cloudflare Workers 函数中存储和检索 Fauna 数据。
  • 学习使用 Wrangler 命令行界面(CLI)进行项目管理。
  • 了解如何在本地运行和测试 Cloudflare Workers 函数。

通过结合 Fauna 和 Cloudflare Workers,您可以在单个代码库中创建一个全球分布式、强一致性、完全无服务器的 REST API。这种架构既保留了单体应用开发的便利性,又具备分布式应用在边缘运行的弹性和低延迟优势。


开始构建 REST API

安装 Wrangler CLI 并创建项目

首先,确保您拥有一个 Cloudflare 账户。然后,使用以下命令全局安装 Wrangler CLI:

npm install -g @cloudflare/wrangler

安装完成后,创建一个新的 Cloudflare Workers 项目:

npx create-cloudflare@latest

在 CLI 提示中,输入项目目录名称,并选择“Hello World”Worker 选项。随后,选择使用 TypeScript 和 Git。

完成项目创建后,进入项目目录并运行以下命令启动应用程序:

wrangler dev

访问 http://127.0.0.1:8787/,确保 Worker 函数正常运行。


配置 Fauna 数据库

  1. 登录 Fauna Dashboard 并创建一个新数据库。
  2. 为数据库命名,选择“全球区域组”,然后点击“创建”。
  3. 在数据库资源管理器中,创建一个名为 inventory 的集合。
  4. 生成一个服务器角色的管理密钥,并将其保存下来。该密钥以 fn 开头,将用于连接到数据库。

集成 Fauna 到 Cloudflare Workers

在本地终端中运行以下命令,将 Fauna 的 npm 包添加到项目中:

npm install faunadb

然后,在 wrangler.toml 文件中添加一个名为 FAUNA_SECRET 的环境变量,并将其值设置为之前生成的 Fauna 密钥。

在代码中,导入 faunadb 库并初始化 Fauna 客户端:

import { Client, query as q } from 'faunadb';

const client = new Client({
  secret: process.env.FAUNA_SECRET,
});

实现 REST API 端点

GET 端点

通过以下代码实现 GET 请求端点,用于获取集合中的所有项目或通过 ID 获取单个项目:

case 'GET': {
  const url = new URL(request.url);
  const id = url.searchParams.get('id');

  if (id) {
    const item = await client.query(q.Get(q.Ref(q.Collection('inventory'), id)));
    return new Response(JSON.stringify(item), { status: 200 });
  } else {
    const items = await client.query(q.Map(
      q.Paginate(q.Documents(q.Collection('inventory'))),
      q.Lambda('ref', q.Get(q.Var('ref')))
    ));
    return new Response(JSON.stringify(items), { status: 200 });
  }
}

POST 端点

实现 POST 请求端点,用于向集合中添加新项目:

case 'POST': {
  const data = await request.json();
  const item = await client.query(
    q.Create(q.Collection('inventory'), { data })
  );
  return new Response(JSON.stringify(item), { status: 201 });
}

PUT 端点

实现 PUT 请求端点,用于通过 ID 更新集合中的项目:

case 'PUT': {
  const url = new URL(request.url);
  const id = url.searchParams.get('id');
  const data = await request.json();

  if (id) {
    const updatedItem = await client.query(
      q.Update(q.Ref(q.Collection('inventory'), id), { data })
    );
    return new Response(JSON.stringify(updatedItem), { status: 200 });
  } else {
    return new Response('ID is required', { status: 400 });
  }
}

DELETE 端点

实现 DELETE 请求端点,用于通过 ID 删除集合中的项目:

case 'DELETE': {
  const url = new URL(request.url);
  const id = url.searchParams.get('id');

  if (id) {
    await client.query(q.Delete(q.Ref(q.Collection('inventory'), id)));
    return new Response('Item deleted', { status: 200 });
  } else {
    return new Response('ID is required', { status: 400 });
  }
}

使用 itty-router 优化代码

为了更好地组织代码,可以使用 itty-router 路由器。首先安装该库:

npm install itty-router

以下是使用 itty-router 重构后的代码示例:

import { Router } from 'itty-router';

const router = Router();router.get('/inventory', async () => {
  const items = await client.query(q.Map(
    q.Paginate(q.Documents(q.Collection('inventory'))),
    q.Lambda('ref', q.Get(q.Var('ref')))
  ));
  return new Response(JSON.stringify(items), { status: 200 });
});router.post('/inventory', async (request) => {
  const data = await request.json();
  const item = await client.query(
    q.Create(q.Collection('inventory'), { data })
  );
  return new Response(JSON.stringify(item), { status: 201 });
});// 更多路由...addEventListener('fetch', (event) =>
  event.respondWith(router.handle(event.request))
);

总结

通过本教程,您学习了如何结合使用 Fauna 和 Cloudflare Workers 构建一个全球分布式、强一致性、无服务器的 REST API。该 API 能够快速、准确地向全球用户提供数据,同时具备高扩展性和低延迟的优势。尝试不同的请求,并在 Fauna 仪表板中验证数据的插入和更新是否符合预期。希望本教程能为您的项目提供有价值的参考!

原文链接: https://fauna.com/blog/build-a-global-rest-api-with-cloudflare-and-fauna