Funções (Deno)

Funções serverless em TypeScript no seu próprio servidor. Escreva, faça deploy e invoque via HTTPS.

Criando um servidor de funções

Para criar um novo runtime de funções:

  1. Acesse Servidores de funções no painel do sh0.
  2. Clique em Criar servidor de funções.
  3. Informe um nome (por exemplo, "my-api-functions").
  4. Clique em Criar. O sh0 faz o deploy de uma instância do runtime Deno com SSL automático.

Cada servidor de funções usa aproximadamente 256 MB de memória e fica acessível em https://<name>.sh0.app.

Escrevendo funções

As funções usam o padrão das Web APIs: um export padrão que recebe um Request e retorna um 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' } },
);
}

Objeto Request

O objeto Request é o Request padrão das Web APIs. Acesse:

  • req.method — método HTTP (GET, POST etc.)
  • req.url — URL completa da requisição
  • req.headers — cabeçalhos da requisição
  • await req.json() — faz o parse do corpo JSON
  • await req.text() — texto bruto do corpo

Objeto Response

Retorne um Response padrão das Web APIs. Você pode retornar qualquer tipo de conteúdo:

// 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 });

Deploy

Faça o deploy da sua função enviando o arquivo TypeScript/JavaScript pelo:

  • Painel — cole ou envie o arquivo da função na página de detalhes do servidor de funções.
  • API — envie o código da função via POST para o endpoint da API do sh0 do seu servidor de funções.

O Deno compila e armazena a função em cache na primeira requisição. As requisições seguintes são servidas a partir do cache.

Tip
Nenhuma etapa de build é necessária. O Deno suporta TypeScript nativamente. Basta escrever .ts e fazer o deploy.

Invocação

Chame sua função no endpoint HTTPS dela:

# 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\"}'

Usando pacotes npm

O Deno permite importar pacotes npm diretamente com o especificador 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')!);
// ...
}

Você também pode importar de URLs (https://deno.land/x/...) ou usar import maps para imports mais limpos.

Conectando a bancos de dados

Suas funções podem se conectar a qualquer servidor de banco de dados gerenciado pelo sh0. Use o hostname da rede Docker interna para conexões locais e rápidas:

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
Armazene as credenciais do banco de dados como variáveis de ambiente, não fixas no código da função. Configure-as nas configurações do servidor de funções.