文档/ 后端即服务/ 函数(Deno)

函数(Deno)

在您自己的服务器上运行 Serverless TypeScript 函数。编写、部署,并通过 HTTPS 调用。

创建函数服务器

创建新的函数运行时:

  1. 在 sh0 仪表盘中进入函数服务器。
  2. 点击创建函数服务器。
  3. 输入名称(例如“my-api-functions”)。
  4. 点击创建。sh0 会部署一个自动配置 SSL 的 Deno 运行时实例。

每个函数服务器约占用 256 MB 内存,可通过 https://<name>.sh0.app 访问。

编写函数

函数采用标准 Web API 模式:一个默认导出,接收 Request 并返回 Response。

export default async function(req: Request) {
const url = new URL(req.url);
const name = url.searchParams.get('name') ?? 'world';
return new Response(
JSON.stringify({ hello: name }),
{ headers: { 'Content-Type': 'application/json' } },
);
}

Request 对象

Request 对象就是标准的 Web API Request。可访问:

  • req.method:HTTP 方法(GET、POST 等)
  • req.url:完整的请求 URL
  • req.headers:请求头
  • await req.json():解析 JSON 请求体
  • await req.text():原始请求体文本

Response 对象

返回标准的 Web API Response。可以返回任意内容类型:

// JSON
return new Response(JSON.stringify(data), {
headers: { 'Content-Type': 'application/json' }
});
// HTML
return new Response('<h1>Hello</h1>', {
headers: { 'Content-Type': 'text/html' }
});
// Status codes
return new Response('Not found', { status: 404 });

部署

通过以下方式上传 TypeScript/JavaScript 文件来部署函数:

  • 仪表盘:在函数服务器详情页粘贴或上传函数文件。
  • API:将函数代码 POST 到函数服务器对应的 sh0 API 端点。

Deno 会在首次请求时编译并缓存函数,后续请求直接从缓存提供服务。

Tip
无需构建步骤。Deno 原生支持 TypeScript,只需编写 .ts 并部署。

调用

通过 HTTPS 端点调用函数:

# GET request
curl https://my-api-functions.sh0.app/?name=sh0
# POST with JSON body
curl -X POST https://my-api-functions.sh0.app/ \
-H "Content-Type: application/json" \
-d '{\"action\": \"process\"}'

使用 npm 包

Deno 支持使用 npm: 说明符直接导入 npm 包:

import Stripe from "npm:stripe";
import { z } from "npm:zod";
export default async function(req: Request) {
const stripe = new Stripe(Deno.env.get('STRIPE_KEY')!);
// ...
}

也可以从 URL(https://deno.land/x/...)导入,或使用 import map 让导入更简洁。

连接数据库

函数可以连接 sh0 管理的任意数据库服务器。使用内部 Docker 网络主机名即可获得快速的本地连接:

import postgres from "npm:postgres";
const sql = postgres({
host: 'my-postgres-server', // Docker network name
port: 5432,
database: 'mydb',
username: 'user',
password: Deno.env.get('DB_PASSWORD'),
});
export default async function(req: Request) {
const users = await sql`SELECT * FROM users LIMIT 10`;
return new Response(JSON.stringify(users));
}
Warning
请将数据库凭据存储为环境变量,不要硬编码在函数中。可在函数服务器设置中配置。