边缘函数

函数中的路由处理

如何在边缘函数中处理自定义路由。


通常情况下,边缘函数被设计为执行单一操作(例如向数据库写入一条记录)。然而,如果您的应用逻辑被分散到多个边缘函数中,每个操作的请求可能会显得较慢。 这是因为每个边缘函数在处理请求前都需要启动(即所谓的冷启动)。对于执行频率较低的操作(例如删除记录),该函数有很大概率会遇到冷启动问题。

减少冷启动并提升应用性能的一种方法是将多个操作合并到单个边缘函数中。这样只需启动一个边缘函数实例,就能处理针对不同操作的多项请求。 例如,我们可以使用单个边缘函数来创建典型的CRUD API(创建、读取、更新、删除记录)。

要将多个端点合并到单个边缘函数中,您可以使用Web应用框架,如ExpressOakHono

下面让我们通过具体示例来深入了解。

使用框架进行路由

以下是使用一些流行Web框架实现的简单"Hello World"示例。

使用Supabase CLI创建一个名为hello-world的新函数:

1
supabase functions new hello-world

复制并粘贴以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { Hono } from 'jsr:@hono/hono';const app = new Hono();app.post('/hello-world', async (c) => { const { name } = await c.req.json(); return new Response(`Hello ${name}!`)});app.get('/hello-world', (c) => { return new Response('Hello World!')});Deno.serve(app.fetch);

您会注意到在上面的示例中,我们创建了两个路由 - GETPOST。这两个路由的路径都定义为/hello-world。 如果在边缘函数之外运行服务器,通常会设置根路径为/。 但在边缘函数中,路径应始终以函数名作为前缀(本例中为hello-world)。

您可以通过以下命令将函数部署到Supabase:

1
supabase functions deploy hello-world

函数部署完成后,可以使用cURL(或Postman)调用这两个端点。

1
2
3
4
5
6
# 调用远程函数```bash cURL# https://supabase.com/docs/guides/functions/deploy#invoking-remote-functionscurl --request GET 'https://<project_ref>.supabase.co/functions/v1/hello-world' \ --header 'Authorization: Bearer ANON_KEY' \

这应该会输出响应 Hello World!,表示请求被 GET 路由处理。

同样地,我们也可以向 POST 路由发起请求:

1
2
3
4
5
# https://supabase.com/docs/guides/functions/deploy#invoking-remote-functionscurl --request POST 'https://<project_ref>.supabase.co/functions/v1/hello-world' \ --header 'Authorization: Bearer ANON_KEY' \ --header 'Content-Type: application/json' \ --data '{ "name":"Foo" }'

我们应该会看到响应输出 Hello Foo!

使用路由参数

我们可以使用路由参数来捕获特定URL段中的值(例如/tasks/:taskId/notes/:noteId)。

以下是一个使用路由参数管理任务的边缘函数实现示例。需要注意的是,路径必须以函数名作为前缀(本例中为tasks)。路由参数只能在函数名前缀之后使用。

URL 模式 API

如果您不想使用 web 框架,可以直接在边缘函数中使用 URL 模式 API 来实现路由功能。 这对于只有少量路由且需要自定义匹配算法的小型应用非常理想。

以下是一个使用 URL 模式 API 的边缘函数示例:https://github.com/supabase/supabase/blob/master/examples/edge-functions/supabase/functions/restful-tasks/index.ts