规划你的实现
例如,假设你正在构建一个类似 Salesforce 的 SaaS CRM 平台。 你希望赋予你的客户编写 JavaScript 代码的能力,这些代码将在每次捕获到新线索时执行。
如果你打算使用 Deno Deploy 实现此功能,以下是你可以考虑的构建方法
- 创建一个 **项目**,并将该项目与数据库中的客户帐户关联。 这将允许你跟踪每个客户产生的使用情况,并可能使用有关该项目的分析信息对他们进行计费。
- 创建一个 **部署**,其中包含你的最终用户提供的代码,该代码应在创建新线索时运行。
- 使用同一项目中的多个部署,你可以实现事件处理逻辑的“暂存”或“生产”版本。
- 你的 CRM 软件将通过向部署发送 HTTP 请求并等待响应,与最终用户的代码进行通信。
- 将来,如果你想支持为 CRM 中的其他事件编写代码(例如创建新联系人或每晚发送自动报告),你可以为每个事件创建一个项目,并使用类似于上述流程进行处理。
让我们看一个实现此功能所需的 API 端点的示例。
为项目创建部署 跳转到标题
在 上一章 中,你创建了一个新项目并记下了它的 id
属性。 在上一章的示例中,ID 为
f084712a-b23b-4aba-accc-3c2de0bfa26a
你可以使用项目标识符 为该项目创建部署。 创建一个名为 create_deployment.ts
的新文件,并包含以下代码以为你项目创建新的“hello world”部署。
create_deployment.ts
const accessToken = Deno.env.get("DEPLOY_ACCESS_TOKEN");
const API = "https://api.deno.com/v1";
// Replace with your desired project ID
const projectId = "your-project-id-here";
// Create a new deployment
const res = await fetch(`${API}/projects/${projectId}/deployments`, {
method: "POST",
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
entryPointUrl: "main.ts",
assets: {
"main.ts": {
"kind": "file",
"content":
`export default { async fetch(req) { return new Response("Hello, World!"); } }`,
"encoding": "utf-8",
},
},
envVars: {},
}),
});
const deployment = await res.json();
console.log(res.status);
console.log(
"Visit your site here:",
`https://${project.name}-${deployment.id}.deno.dev`,
);
如果你使用以下命令运行此脚本
deno run -A --env create_deployment.ts
你很快就会在公共 URL 上拥有一个简单的“Hello World!”服务器,可从你的 Deno Deploy 仪表板中看到。
部署的组成部分 跳转到标题
上面的示例展示了一个非常简单的部署示例。 更复杂的部署可能包含以下组件中的一些或全部,在 API 文档中进行了详细描述。
- **资产:** TypeScript 或 JavaScript 源文件、图像、JSON 文档 - 使你的部署运行的代码和静态文件。 这些文件可以编码在你使用
utf-8
(对于纯源文件)或base64
(对于图像和其他文本文件)上传到服务器的 JSON 中。 除了实际文件之外,你还可以包含指向其他文件的符号链接。 - **入口点 URL:** 上述集合中一个资产(TypeScript 或 JavaScript 文件)的文件路径,该资产应执行以启动你的部署中的服务器。
- **环境变量:** 你可以指定应存在于系统环境中的值,以便通过
Deno.env.get
检索。 - **数据库 ID:** 应提供给此部署的 Deno KV 数据库的标识符。
- **编译器选项:** 应用于解释 TypeScript 代码的一组选项。
自定义域名 跳转到标题
创建部署后,将为其分配一个生成的 URL。 这可能适合某些情况,但通常你也要将自定义域名与你的部署相关联。 查看域名 API 参考。