PostgreSQL 数据库
了解如何在 Cloudflare Workers / Pages 上部署的 Nuxt 应用程序中使用 PostgreSQL,以及如何使用 Hyperdrive 加速您的查询。
先决条件
Cloudflare 不托管 PostgreSQL 数据库,您需要自行设置 PostgreSQL 数据库。
如果您更愿意使用 Cloudflare 服务,您可以使用基于 SQLite 的 Cloudflare D1,请查看我们的 数据库 部分。
设置
- 确保使用
@nuxthub/core
模块,请查看 安装部分 以获取说明。
nuxt.config.ts
export default defineNuxtConfig({
modules: ['@nuxthub/core'],
});
该模块确保您可以使用 Cloudflare TCP 套接字 连接到您的 PostgreSQL 数据库。
- 在您的项目中安装
postgres
NPM 包。
npx nypm i postgres
就是这样,您现在可以使用
postgres
包连接到您的 PostgreSQL 数据库。用法
我们可以在 .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)。
要在您的 Nuxt 应用程序中使用 Hyperdrive
- 创建 Hyperdrive 配置
- 在您的
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'
}
}
}
})
- 更新我们的
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()
。- 使用 NuxtHub CLI 或管理面板 部署您的应用程序,以确保 Hyperdrive 绑定已设置。
您现在可以从世界任何地方以最快的速度访问您的 PostgreSQL 数据库。