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

作者:API传播员 · 2025-10-23 · 阅读时间:5分钟
本教程详细演示了如何使用Cloudflare Workers和Fauna构建全球化的无服务器REST API,实现低延迟、高扩展性和强一致性,适用于实时数据分析、游戏后端和电商等应用场景。

一. 项目概述

确保您的应用在全球范围内具备卓越的速度、可靠性和可访问性已不再是可选项,而是一种必需。通过结合使用 Cloudflare WorkersFauna,您可以轻松构建全球分布式、低延迟、高扩展性的无服务器 REST API。

该架构特别适合实时数据分析、游戏后端、聊天应用、视频/音乐分享平台以及电子商务系统等对低延迟和全球访问性能要求高的应用场景。


二. 学习目标

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

通过该组合,开发者可以在单个代码库中创建强一致性、全球分布、完全无服务器的 REST API,兼顾单体开发便利性和分布式低延迟优势。


三. 开始构建 REST API

1. 安装 Wrangler CLI 并创建项目

确保您拥有 Cloudflare 账户。全局安装 Wrangler CLI:

npm install -g @cloudflare/wrangler

创建新的 Worker 项目:

npx create-cloudflare@latest

在 CLI 提示中:

  • 输入项目名称
  • 选择“Hello World”Worker
  • 使用 TypeScript 和 Git

进入项目目录后运行:

wrangler dev

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


2. 配置 Fauna 数据库

  1. 登录 Fauna Dashboard 并创建新数据库。
  2. 命名数据库并选择“全球区域组”,点击“创建”。
  3. 在数据库资源管理器中创建 inventory 集合。
  4. 生成服务器角色管理密钥(以 fn 开头),用于连接数据库。

3. 集成 Fauna 到 Cloudflare Workers

安装 Fauna npm 包:

npm install faunadb

wrangler.toml 中添加环境变量:

FAUNA_SECRET = "你的 Fauna 密钥"

在代码中初始化 Fauna 客户端:

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

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

四. 实现 REST API 端点

1. GET 请求

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 });
  }
}

2. 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 });
}

3. PUT 请求

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 });
  }
}

4. DELETE 请求

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

使用示例:

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))
);

六. 总结

通过本文教程,您已学习如何结合 Cloudflare WorkersFauna 构建全球分布式、强一致性、无服务器的 REST API。该架构可在全球范围内提供低延迟、高可靠性和可扩展性的数据访问,适合实时分析、游戏、聊天、视频/音乐共享及电商等场景。

尝试不同请求类型,并在 Fauna 仪表板中验证数据插入和更新是否正确,以便在实际项目中应用。

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