函数(Deno)
在您自己的服务器上运行 Serverless TypeScript 函数。编写、部署,并通过 HTTPS 调用。
创建函数服务器
创建新的函数运行时:
- 在 sh0 仪表盘中进入函数服务器。
- 点击创建函数服务器。
- 输入名称(例如“my-api-functions”)。
- 点击创建。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:完整的请求 URLreq.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
请将数据库凭据存储为环境变量,不要硬编码在函数中。可在函数服务器设置中配置。