我們很高興地宣布,Edge Functions 現在原生支援 npm 模組和 Node 內建 API。您可以將數百萬個流行、常用的 npm 模組直接匯入 Edge Functions 中。

從 'npm:drizzle-orm/node-postgres' 導入 { drizzle }

將現有 Node 應用程式遷移到 Edge Functions

您可以透過最少的變更將現有的 Node 應用程式遷移到 Supabase Edge Functions。

我們建立了一個示範來展示如何遷移使用 Express、Node Postgres 和 Drizzle 的 Node 應用程式。有關在 Edge Functions 中使用 npm 模組和 Node 內建程式的更多訊息,請參閱管理依賴項指南

{% 嵌入 https://youtu.be/eCbiywoDORw %}

npm 模組的底層運作原理

我們執行一個開源 Deno 伺服器來託管 Edge Functions,稱為 Supabase Edge Runtime。此自訂版本可協助我們保持 Edge Functions 以相同的方式運作,無論部署在何處 - 在我們的託管平台上、在本地開發中還是在您的自託管環境中。

加入 npm 支援時最大的挑戰是找到適用於所有環境的方法。我們希望保持工作流程接近 Deno CLI 體驗。應該可以直接在原始程式碼中導入 npm 模組,而無需額外的建置步驟。

部署函數時,我們將其模組圖序列化為單一檔案格式(eszip)。在託管環境中,所有模組引用都會從 eszip 中載入。這可以防止獲取模組時出現任何額外的延遲以及模組依賴關係之間的潛在衝突。

我們也在本機和自架環境中使用了 eszip 模組載入器,因此我們只需要為所有環境實作一種模組載入策略。作為本地開發的另一個好處,此方法避免了與使用者係統中安裝的 npm 模組的潛在衝突,因為 Edge Function 的 npm 模組是獨立於 eszip 中的。

重構模組載入器修正了一些其他錯誤,例如[邊緣函數錯誤](https://github.com/supabase/cli /issues/1584#issuecomment-1848799355) 當專案中已存在deno.lock 檔案時。

您要求的其他一些東西...

區域呼叫

現在,您可以選擇在執行邊緣函數時指定區域(也許我們將來應該更改名稱)。通常,邊緣函數在最靠近呼叫函數的使用者的區域中執行。但是,有時您希望在靠近 Postgres 資料庫或其他第 3 方 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 儀表板 的 Edge Functions 部分中加入了更多指標:它現在顯示 CPU 時間和使用的記憶體。我們也按 HTTP 狀態碼細分了呼叫。

這些變更可協助您發現邊緣功能的任何問題並採取行動。

ℹ️ 請參閱 Edge Functions 的日誌記錄和指標指南 以了解更多資訊。

使用視覺化範例

使用 Sentry 追蹤錯誤

我們 Sentry 的朋友最近發布了官方的 Sentry SDK for Deno。有了這個,現在可以輕鬆追蹤 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 用戶來說,區域呼叫、更好的指標和錯誤處理只是接下來會發生的事情的一瞥。我們繼續迭代平台穩定性並對邊緣功能可以使用的資源設定自訂限制。請留意新的一年的另一篇文章。

更多發布第 X 週


原文出處:https://dev.to/supabase/edge-functions-node-and-native-npm-compatibility-77f


共有 0 則留言