PostgreSQL 数据库

了解如何在 Cloudflare Workers / Pages 上部署的 Nuxt 应用程序中使用 PostgreSQL,以及如何使用 Hyperdrive 加速您的查询。

先决条件

Cloudflare 不托管 PostgreSQL 数据库,您需要自行设置 PostgreSQL 数据库。

查看专业的 PostgreSQL 托管提供商列表。

如果您更愿意使用 Cloudflare 服务,您可以使用基于 SQLite 的 Cloudflare D1,请查看我们的 数据库 部分。

设置

  1. 确保使用 @nuxthub/core 模块,请查看 安装部分 以获取说明。
nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxthub/core'],
});
该模块确保您可以使用 Cloudflare TCP 套接字 连接到您的 PostgreSQL 数据库。
  1. 在您的项目中安装 postgres NPM 包。
npx nypm i postgres
就是这样,您现在可以使用 postgres 包连接到您的 PostgreSQL 数据库。
请注意,为了使用 pg,需要最低版本的 8.13.0,以及 wrangler 3.78.7 或更高版本和 compatibility_date = "2024-09-23"

用法

我们可以在 .env 文件中添加 PostgreSQL 数据库连接。

.env
NUXT_POSTGRES_URL=postgresql://user:password@localhost:5432/database

然后,我们可以创建一个 usePostgres() 服务器工具,以便在我们的 API 路由中连接到我们的数据库。

server/utils/postgres.ts
import postgres from 'postgres'

export function usePostgres () {
  if (!process.env.NUXT_POSTGRES_URL) {
    throw createError('Missing `NUXT_POSTGRES_URL` environment variable')
  }

  return postgres(process.env.NUXT_POSTGRES_URL as string, {
    ssl: 'require'
  })
}

我们现在可以使用 usePostgres() 函数在我们的 API 路由中连接到我们的数据库。

server/api/db.ts
export default eventHandler(async (event) => {
  const sql = usePostgres()

  const products = await sql`SELECT * FROM products`

  // Ensure the database connection is closed after the request is processed
  event.waitUntil(sql.end())
  return products
})
您可能会注意到我们没有导入 usePostgres()。这是因为 Nuxt 在使用时会自动导入从 server/utils/*.ts 导出的变量和函数。

Hyperdrive

Hyperdrive 是 Cloudflare 的一项服务,它可以加速您对现有数据库的查询,使您能够更快地访问全球各地的数据。通过在 Cloudflare 网络中维护到您的数据库的连接池,Hyperdrive 减少了在您发送查询之前进行七轮往返到您的数据库的次数:TCP 握手 (1x)、TLS 协商 (3x) 和数据库身份验证 (3x)。

Hyperdrive 仅在 Workers 付费计划 (每月 5 美元) 中提供,**了解更多信息**。

要在您的 Nuxt 应用程序中使用 Hyperdrive

  1. 创建 Hyperdrive 配置
  2. 在您的 nuxt.config.ts 文件中添加您的 Hyperdrive ID
nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxthub/core'],
  hub: {
    bindings: {
      hyperdrive: {
        // <BINDING_NAME>: <HYPERDRIVE_ID>
        POSTGRES: 'your-hyperdrive-id'
      }
    }
  }
})
  1. 更新我们的 usePostgres() 函数以使用可用的 POSTGRES 绑定。
server/utils/postgres.ts
import type { Hyperdrive } from '@cloudflare/workers-types'
import postgres from 'postgres'

export function usePostgres() {
  const hyperdrive = process.env.POSTGRES as Hyperdrive | undefined
  const dbUrl = hyperdrive?.connectionString || process.env.NUXT_POSTGRES_URL
  if (!dbUrl) {
    throw createError('Missing `POSTGRES` hyperdrive binding or `NUXT_POSTGRES_URL` env variable')
  }

  return postgres(dbUrl, {
    ssl: !hyperdrive ? 'require' : undefined
  })
}
Hyperdrive 目前在开发模式下不可用。我们正在努力解决开发模式和远程存储中的问题,并将推出一个新的 hubHyperdrive()
  1. 使用 NuxtHub CLI 或管理面板 部署您的应用程序,以确保 Hyperdrive 绑定已设置。
您现在可以从世界任何地方以最快的速度访问您的 PostgreSQL 数据库。