边缘功能:Node 和原生 npm 兼容性
我们很高兴地宣布,Edge Functions现已原生支持 npm 模块和 Node 内置 API。您可以将数百万个常用的 npm 模块直接导入到 Edge Functions 中。
import { drizzle } from 'npm:drizzle-orm/node-postgres'
将现有 Node 应用迁移到 Edge Functions
您只需进行最少的更改即可将现有的 Node 应用程序迁移到 Supabase Edge Functions。
我们创建了一个演示,展示如何迁移使用 Express、Node Postgres 和 Drizzle 的 Node 应用。有关在 Edge Functions 中使用 npm 模块和 Node 内置函数的更多信息,请参阅管理依赖项指南。
npm 模块的工作原理
我们运行一个名为Supabase Edge Runtime的开源 Deno 服务器来托管 Edge Functions 。此自定义版本可帮助我们确保 Edge Functions 无论部署在何处(在我们的托管平台上、在本地开发中,还是在您的自托管环境中)都能以相同的方式运行。
添加 npm 支持时最大的挑战是找到一种适用于所有环境的方法。我们希望工作流程与 Deno CLI 的体验保持接近。应该能够直接在源代码中导入 npm 模块,而无需额外的构建步骤。
部署函数时,我们会将其模块图序列化为单个文件格式(eszip)。在托管环境中,所有模块引用都会从 eszip 文件中加载。这可以避免获取模块时出现任何额外的延迟,并避免模块依赖项之间潜在的冲突。
我们在本地和自托管环境中也使用了 eszip 模块加载器,因此我们只需为所有环境实现一个模块加载策略。对于本地开发来说,这种方法的另一个好处是,由于 Edge Function 的 npm 模块在 eszip 中是独立的,因此可以避免与用户系统中安装的 npm 模块发生潜在冲突。
重构模块加载器修复了一些其他错误,例如当项目中已经存在文件时边缘函数就会出错。deno.lock
您还要求了一些其他的事情……
区域祈祷
现在,您可以在运行边缘函数时指定区域(未来我们或许会更改名称)。通常,边缘函数会在距离调用该函数的用户最近的区域运行。但是,有时为了获得最佳性能,您希望将其运行在更靠近 Postgres 数据库或其他第三方 API 的区域。
函数仍然会部署到所有区域。但是,在调用期间,您可以提供x-region
标头以将执行限制在特定区域。
卷曲
# https://supabase.com/docs/guides/functions/deploy#invoking-remote-functions
curl --request POST 'https://<project_ref>.supabase.co/functions/v1/hello-world' \
--header 'Authorization: Bearer ANON_KEY' \
--header 'Content-Type: application/json' \
--header 'x-region: eu-west-3' \
--data '{ "name":"Functions" }'
JavaScript
// https://supabase.com/docs/reference/javascript/installing
import { createClient } from '@supabase/supabase-js'
// Create a single supabase client for interacting with your database
const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key')
// https://supabase.com/docs/reference/javascript/functions-invoke
const { data, error } = await supabase.functions.invoke('hello-world', {
body: { name: 'Functions' },
headers: { 'x-region': 'eu-west-3' },
})
ℹ️ 查看区域调用指南以了解更多详细信息。
更好的指标
我们在Supabase 仪表盘的“边缘函数”部分添加了更多指标:现在显示 CPU 时间和内存使用情况。我们还按 HTTP 状态代码细分了调用情况。
这些变化可以帮助您发现 Edge Functions 的任何问题并采取行动。
ℹ️ 请参阅Edge Functions 的日志记录和指标指南以了解更多信息。
使用 Sentry 跟踪错误
Sentry 团队最近发布了Deno 官方的 Sentry SDK。有了它,现在可以轻松地在 Sentry 中跟踪边缘函数中的错误和异常。
这是一个如何在函数内处理异常并将其发送给 Sentry 的简单示例。
import * as Sentry from 'https://deno.land/x/sentry/index.mjs'
Sentry.init({
dsn: _DSN_,
integrations: [],
// Performance Monitoring
tracesSampleRate: 1.0,
// Set sampling rate for profiling - this is relative to tracesSampleRate
profilesSampleRate: 1.0,
})
// Set region and execution_id as custom tags
Sentry.setTag('region', Deno.env.get('SB_REGION'))
Sentry.setTag('execution_id', Deno.env.get('SB_EXECUTION_ID'))
Deno.serve(async (req) => {
try {
const { name } = await req.json()
const data = {
message: `Hello ${name}!`,
}
return new Response(JSON.stringify(data), { headers: { 'Content-Type': 'application/json' } })
} catch (e) {
Sentry.captureException(e)
return new Response(JSON.stringify({ msg: 'error' }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
})
}
})
下一步
NPM 支持是 Edge Functions 最受期待的功能之一。如果您之前因为缺乏支持而无法使用 Edge Functions,我们希望此次更新能吸引您再次尝试。如果您遇到任何问题,只需一个支持请求即可联系我们。
对于现有的 Edge Functions 用户,区域调用、更优的指标和错误处理只是未来功能的冰山一角。我们将继续改进平台稳定性,并设置 Edge Functions 可使用资源的自定义限制。敬请期待新年期间的更多博客文章。
更多发布周 X
- 第 1 天 - Supabase Studio 更新:AI 助手和用户模拟
- pg_graphql:现在支持 Postgres 函数
- Postgres 语言服务器:实现解析器
- Supabase 的设计工作方式
- Supabase 专辑
- Supabase 发布周 X 黑客马拉松
- 启动第 X 周社区聚会