我如何将 Google Sheets 变成使用 AWS Serverless 的超高速 REST API

发布: (2026年2月23日 GMT+8 00:14)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本内容,我将按照要求保留原始的 Markdown 格式、代码块和链接,仅翻译正文部分为简体中文。谢谢!

介绍

我们都有过这种经历:需要为原型、内部工具或 NoCode 项目快速搭建后端。部署 PostgreSQL 或 MongoDB 觉得太繁琐,于是想,“我就直接把 Google Sheets 当数据库用吧!”

听起来不错,直到你面对 Google Sheets API 的现实:

  • 它很慢(每次请求通常需要 1–2 秒)。
  • 速率限制严格(每位用户每分钟大约只能请求 60 次)。
  • 没有原生查询语言(过滤数据非常麻烦)。

我想要 Google Sheets 的简易性,同时又想要真实后端的性能和安全性。因此,我构建了 SheetToJSON,一个无服务器的包装器,专门解决这些问题。

架构堆栈

  • 路由: AWS HTTP API Gateway
  • 计算: AWS Lambda (Node.js ARM64)
  • 缓存: Amazon S3
  • 安全与认证: Amazon DynamoDB
  • 变现与网关: RapidAPI

挑战 1:突破速率限制和延迟

最大的瓶颈是响应时间。为了解决这个问题,我实现了使用 Amazon S3 的积极缓存策略。

当用户发起 GET 请求(例如,获取产品列表)时,Lambda 函数首先检查 S3 桶中是否有该表的缓存 .json 版本。

  • Cache Hit: 缓存命中: 数据在毫秒级返回。
  • Cache Miss: 缓存未命中: Lambda 从 Google Sheets 获取数据,将原始 JSON 保存到 S3(TTL 为 5 分钟),并返回响应。

为保持数据新鲜,我添加了 write‑through cache:任何 POSTPATCHDELETE 请求都会更新 Google Sheets 并且立即重写本地 S3 缓存。结果是 GET 请求闪电般快速,同时不牺牲新鲜度。

Challenge 2: Smart Querying (No Database Engine)

Google Sheets 没有 SQL 引擎。如果用户想要查找所有价格大于 $50 的产品,通常需要下载整个表格并在客户端进行过滤。

我在 Lambda 函数中直接构建了一个自定义查询引擎。读取 S3 缓存时,API 会拦截查询参数并在内存中处理它们:

// Example: GET /v1/SPREADSHEET_ID/Products?price=gt:50&sort=price:desc

// The API engine automatically parses:
//   "gt:" (greater than)
//   "lt:" (less than)
//   "lk:" (like/contains)
// before returning the paginated payload.

这使得一个普通的电子表格变成了可查询的类 NoSQL 数据库。

挑战 3:多租户安全(防止 IDOR)

如果你在构建 SaaS,安全是你的 #1 优先事项。由于 API 使用单个 Google Service Account 读取表格,什么能阻止用户 A 猜测用户 B 的 Spreadsheet ID 并读取他们的数据?

为防止这种 Insecure Direct Object Reference (IDOR),我添加了一个强制性的 /register 步骤,后端使用 DynamoDB

  1. 用户注册他们的表格;API 将其 X‑RapidAPI‑User ID 与 DynamoDB 中的 spreadsheetId 关联。
  2. 每个 CRUD 请求都会执行一次快速(约 ~15 ms)的 DynamoDB 查询。
  3. 如果请求者的用户 ID 与表格所有者的 ID 不匹配,API 将返回 403 Forbidden

零数据泄露。

结果:开发者体验优先

我希望集成尽可能无缝,因此我发布了零依赖、官方的 Node.jsPHP SDK。

Node.js 示例(使用 TypeScript 完全类型化)

import { SheetToJSON } from 'sheettojson-api';

const db = new SheetToJSON('YOUR_RAPIDAPI_KEY');

const response = await db.get('SPREADSHEET_ID', 'Products', {
    limit: 10,
    price: 'gt:50'
});

console.log(response.data);

试一试!

构建这个项目是一次令人惊叹的 AWS Serverless 架构之旅。如果你正在构建 NoCode 工具、快速原型,或需要即时后端,快来试一试吧。

我目前正在征求对缓存系统和查询引擎的反馈。请在评论中告诉我你的想法!👇

0 浏览
Back to Blog

相关文章

阅读更多 »