跳至主要内容

部署到 Deno Deploy

通过本指南,您可以学习如何使用 Deno Deploy 构建和部署一个简单的应用程序。该应用程序使用 Prisma ORM 将每个请求的日志保存到 Prisma Postgres 数据库中。

本指南涵盖了 Prisma CLI 与 Deno CLI、Deno Deploy、Prisma Client 和 Prisma Postgres 的使用。

无需 Rust 二进制文件即可使用 Prisma ORM

如果 Prisma ORM 的 Rust 引擎二进制文件导致捆绑包大小过大、构建缓慢或部署问题(例如,在无服务器或边缘环境中),您可以在不使用它们的情况下使用它,只需配置您的 generator

generator client {
provider = "prisma-client-js" // or "prisma-client"
engineType = "client"
}

无需 Rust 二进制文件的 Prisma ORM 已于 v6.16.0正式发布

请注意,在这种情况下您需要使用驱动适配器

使用此架构时

  • 不会下载或附带 Rust 查询引擎二进制文件。
  • 数据库连接池由您安装的原生 JS 数据库驱动程序维护(例如,PostgreSQL 的 @prisma/adapter-pg)。

此设置可以简化无服务器或边缘运行时的部署。在此处文档中了解更多信息。

好奇我们为什么放弃 Rust 引擎?请查看这篇博客文章,了解我们为何从 Rust 二进制引擎转向全 TypeScript 方法,以实现更快、更轻的 Prisma ORM。

先决条件

  • 免费帐户
  • 一个免费的 Deno Deploy 账户
  • 已安装 Node.js 和 npm
  • 已安装 Deno v1.29.4 或更高版本。了解更多
  • (推荐)最新版本的 Prisma ORM。
  • (推荐)VS Code 的 Deno 扩展。了解更多

1. 设置您的应用程序和数据库

首先,您需要为项目创建一个目录,然后使用 deno run 通过 prisma init 将您的应用程序初始化为 带有 npm 说明符的 npm 包

要设置您的应用程序,请打开您的终端并导航到您选择的位置。然后,运行以下命令来设置您的应用程序

mkdir prisma-deno-deploy
cd prisma-deno-deploy
npx prisma@latest init --db

输入您的项目名称并选择一个数据库区域。

此命令

  • 将您的 CLI 连接到您的帐户。如果您未登录或没有帐户,您的浏览器将打开以引导您创建新帐户或登录现有帐户。
  • 创建一个包含数据库模型 schema.prisma 文件的 prisma 目录。
  • 创建一个包含 DATABASE_URL.env 文件(例如,DATABASE_URL="postgresql://user:password@host:5432/database")。

编辑 prisma/schema.prisma 文件以定义 Log 模型,添加自定义 output 路径,并使用 deno 作为 runtime 添加 prisma-client 生成器

schema.prisma
generator client {
provider = "prisma-client-js"
provider = "prisma-client"
output = "../generated/prisma"
runtime = "deno"
}

datasource db {
provider = "postgresql"
}

model Log {
id Int @id @default(autoincrement())
level Level
message String
meta Json
}

enum Level {
Info
Warn
Error
}

然后,安装 Prisma Client 和 Postgres 适配器

deno install npm:@prisma/client
deno install npm:@prisma/adapter-pg

Prisma Client 默认不在 Deno 上读取 .env 文件,因此您还必须本地安装 dotenv-cli

deno install npm:dotenv-cli

2. 创建数据库模式

数据模型和数据库连接都已配置好,现在可以将数据模型应用到数据库中。

deno run -A npm:prisma migrate dev --name init

该命令执行两项操作

  1. 它为本次迁移创建了一个新的 SQL 迁移文件
  2. 它针对数据库运行 SQL 迁移文件

此时,该命令还有额外的副作用。该命令安装 Prisma Client 并为项目创建 package.json 文件。

3. 创建您的应用程序

您现在可以创建本地 Deno 应用程序。在项目的根文件夹中创建 index.ts 并添加以下内容

index.ts
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import { PrismaPg } from "npm:@prisma/adapter-pg";
import { PrismaClient } from "../generated/prisma/client.ts";

const connectionString = `${Deno.env.get("DATABASE_URL")}`;
const adapter = new PrismaPg({ connectionString });
const prisma = new PrismaClient({ adapter });

async function handler(request: Request) {
// Ignore /favicon.ico requests:
const url = new URL(request.url);
if (url.pathname === "/favicon.ico") {
return new Response(null, { status: 204 });
}

const log = await prisma.log.create({
data: {
level: "Info",
message: `${request.method} ${request.url}`,
meta: {
headers: JSON.stringify(request.headers),
},
},
});
const body = JSON.stringify(log, null, 2);
return new Response(body, {
headers: { "content-type": "application/json; charset=utf-8" },
});
}

serve(handler);
信息

VS Code 错误:导入路径不能以“.ts”扩展名结尾

如果您使用 VS Code 并在 index.ts 开头的 import 语句处看到错误 导入路径不能以“.ts”扩展名结尾,则需要安装 VS Code 的 Deno 扩展,选择 查看 > 命令面板 并运行命令 Deno: 初始化工作区配置。这将告诉 VS Code,当前项目中的 TypeScript 文件需要使用 Deno 运行,从而触发正确的验证。

4. 在本地测试您的应用程序

您现在可以在本地启动您的应用程序并测试日志条目的创建。

npx dotenv -- deno run -A ./index.ts

在 Web 浏览器中,打开 https://:8000/。此页面会将您的请求写入数据库。

{
"id": 1,
"level": "Info",
"message": "GET https://:8000/",
"meta": {
"headers": "{}"
}
}

刷新页面几次。

每次刷新时,脚本都会生成一个新的日志条目,并且当前日志条目的 id 会递增。

这确认了您的应用程序在本地环境中运行时可以正常工作。

5. 创建存储库并推送到 GitHub

您需要一个 GitHub 存储库,以便将您的项目添加到 Deno Deploy 并启用在您推送更改时进行自动化部署。

要设置 GitHub 存储库

  1. 创建私有 GitHub 存储库.

  2. 使用以下命令在本地初始化您的存储库并将您的更改推送到 GitHub

    git init -b main
    git remote add origin https://github.com/<username>/prisma-deno-deploy
    git add .
    git commit -m "initial commit"
    git push -u origin main

6. 部署到 Deno Deploy

使用 GitHub 存储库将您的应用程序添加到 Deno Deploy

  1. 前往 https://dash.deno.com/
  2. 选择 GitHub 组织或用户,然后选择一个存储库。
  3. 选择一个生产分支并选择 Fresh (自动) 模式,这样 Deno Deploy 就可以在每次您推送更改到存储库时进行部署。
  4. 构建步骤 中添加 deno run -A npm:prisma generate 来生成 Prisma Client。
  5. 选择 index.ts 作为项目的入口点。
  6. 点击 创建并部署

部署应该会失败,因为您必须添加 DATABASE_URL 环境变量。

找到并导航到项目的设置。

  1. 要定义数据库连接字符串,请在 环境变量 部分点击 添加变量
    1. 对于 KEY,输入 DATABASE_URL
    2. 对于 VALUE,粘贴数据库连接字符串。
  2. 单击保存

您必须添加一些代码并创建另一次提交以触发重新部署。

在您的 index.ts 文件中添加以下代码

index.ts
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import { PrismaPg } from "npm:@prisma/adapter-pg";
import { PrismaClient } from "../generated/prisma/client.ts";

const connectionString = `${Deno.env.get("DATABASE_URL")}`;
const adapter = new PrismaPg({ connectionString });
const prisma = new PrismaClient({ adapter });

async function handler(request: Request) {
// Ignore /favicon.ico requests:
const url = new URL(request.url);
if (url.pathname === "/favicon.ico") {
return new Response(null, { status: 204 });
}

console.log("Request received.")

const log = await prisma.log.create({
data: {
level: "Info",
message: `${request.method} ${request.url}`,
meta: {
headers: JSON.stringify(request.headers),
},
},
});
const body = JSON.stringify(log, null, 2);
return new Response(body, {
headers: { "content-type": "application/json; charset=utf-8" },
});
}

serve(handler);

提交新的更改

git add . 
git commit -m "add log"
git push origin main

这将重新构建部署,现在可以正常工作,因为已添加环境变量。完成后,请按照部署输出中的 URL 进行操作。应用程序应显示与之前相同的结果,并带有一个新的、递增的日志记录 ID

{
"id": 5,
"level": "Info",
"message": "GET https://prisma-deno-deploy.deno.dev/",
"meta": {
"headers": "{}"
}
}

总结

您已成功部署了一个使用 TypeScript 创建的 Deno 应用程序,该应用程序使用 Prisma Client 和 Postgres 适配器连接到 Postgres 数据库。

© . This site is unofficial and not affiliated with Prisma Data, Inc.