部署到 Deno Deploy
通过本指南,您可以学习如何构建一个简单的应用程序并将其部署到 Deno Deploy。该应用程序使用 Prisma ORM 将每个请求的日志保存到 Prisma Postgres 数据库。
本指南涵盖了 Prisma CLI 与 Deno CLI、Deno Deploy、Prisma Client 和 Prisma Postgres 的使用。
本指南演示了如何将应用程序部署到与 Prisma Postgres 数据库结合使用的 Deno Deploy,但您也可以使用 您自己的数据库与 Prisma Accelerate。
先决条件
- 一个免费的账户
- 一个免费的 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
deno run --reload -A npm:prisma@latest init --db
输入您的项目名称并选择一个数据库区域。
此命令
- 将您的 CLI 连接到您的账户。 如果您未登录或没有帐户,您的浏览器将打开,引导您创建一个新帐户或登录到您现有的帐户。
- 创建一个
prisma
目录,其中包含一个schema.prisma
文件,用于您的数据库模型。 - 创建一个
.env
文件,其中包含您的DATABASE_URL
(例如,对于 Prisma Postgres,它应该包含类似于DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=eyJhbGciOiJIUzI..."
的内容)。
编辑 prisma/schema.prisma
文件以定义 Log
模型,添加自定义 output
路径并启用 deno
预览特性标志
generator client {
provider = "prisma-client-js"
previewFeatures = ["deno"]
output = "../generated/client"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Log {
id Int @id @default(autoincrement())
level Level
message String
meta Json
}
enum Level {
Info
Warn
Error
}
要使用 Deno,您需要在 schema.prisma
文件的 generator
块中添加预览特性标志 deno
。
Deno 还要求您在自定义位置生成 Prisma Client。 您可以使用 generator
块中的 output
参数启用此功能。
然后,安装使用 Prisma Postgres 所需的 Client 扩展
deno install npm:@prisma/extension-accelerate
默认情况下,Prisma Client 不会读取 Deno 上的 .env
文件,因此您还必须在本地安装 dotenv-cli
deno install npm:dotenv-cli
2. 创建数据库模式
有了数据模型并配置了数据库连接,您现在可以将数据模型应用于数据库。
deno run -A npm:prisma migrate dev --name init
该命令执行两件事
- 它为此迁移创建一个新的 SQL 迁移文件
- 它针对数据库运行 SQL 迁移文件
此时,该命令具有额外的副作用。 该命令安装 Prisma Client 并为项目创建 package.json
文件。
3. 创建您的应用程序
您现在可以创建一个本地 Deno 应用程序。 在项目的根文件夹中创建 index.ts
并添加以下内容
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import { withAccelerate } from "npm:@prisma/extension-accelerate";
import { PrismaClient } from "./generated/client/deno/edge.ts";
const prisma = new PrismaClient().$extends(withAccelerate());
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 浏览器中,打开 http://localhost:8000/。 此页面将您的请求写入数据库。
{
"id": 1,
"level": "Info",
"message": "GET http://localhost:8000/",
"meta": {
"headers": "{}"
}
}
重新加载页面几次。
每次重新加载时,脚本都会生成一个新的日志条目,并且当前日志条目的 id
会递增。
这证实了当您从本地环境运行应用程序时,它可以正常工作。
5. 创建存储库并推送到 GitHub
您需要一个 GitHub 存储库才能将您的项目添加到 Deno Deploy,并在您推送更改时启用自动部署。
要设置 GitHub 存储库
-
在本地初始化您的存储库并将您的更改推送到 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
- 前往 https://dash.deno.com/。
- 选择一个 GitHub 组织或用户,然后选择一个仓库。
- 选择一个生产分支,并选择 Fresh (Automatic) 模式,以便 Deno Deploy 可以在每次您将更改推送到仓库时进行部署。
- 选择
index.ts
作为您的项目的入口点。 - 点击
Create & Deploy
。
部署应该会失败,因为您需要添加 DATABASE_URL
环境变量。
找到并导航到该项目的设置。
- 要定义数据库连接字符串,请在 Environment Variables 部分点击 Add Variable。
- 对于 KEY,输入
DATABASE_URL
。 - 对于 VALUE,粘贴数据库连接字符串。
- 对于 KEY,输入
- 点击 Save。
您必须添加一些代码并创建另一个提交来触发重新部署。
将以下代码添加到您的 index.ts
文件中
import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import { withAccelerate } from "npm:@prisma/extension-accelerate";
import { PrismaClient } from "./generated/client/deno/edge.ts";
const prisma = new PrismaClient().$extends(withAccelerate());
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 连接到 Prisma Postgres 数据库。