Migre padrões de handler em Functions
Mova uma função do handler legado Service Worker para o handler ES Modules, com o antes e o depois de fetch e firewall.
Functions suporta dois padrões de handler: ES Modules, que Azion recomenda, e Service Worker, que Azion mantém para compatibilidade com código legado. O código Service Worker existente continua funcionando, então a migração é um trabalho a planejar e não uma quebra a reparar. Código que não segue nenhum dos dois padrões não é suportado.
Padrões de handler suportados
Os dois padrões entregam ao handler a mesma requisição e o mesmo contexto de execução. Eles diferem na forma como o código os recebe.
ES Modules
Uma função ES Modules exporta um objeto padrão. O método fetch desse objeto recebe a requisição, as variáveis de ambiente e bindings e o contexto de execução. Um método firewall recebe os mesmos três argumentos:
Um export padrão cujo método fetch recebe request, env e ctx segue esse padrão, seja ele um objeto literal ou a instância de aplicação que um framework retorna. Uma instância de aplicação construída com um framework atende ao requisito, então um app Hono exportado com export default app é um handler ES Modules. Para uma função escrita dessa forma, consulte Crie uma API RESTful de tarefas com Functions e SQL Database.
Service Worker
Uma função Service Worker registra um listener com addEventListener. O listener lê a requisição a partir de um objeto de evento e responde com event.respondWith:
Parâmetros dos handlers
Um handler ES Modules recebe três argumentos. Um listener Service Worker recebe um objeto de evento que carrega os mesmos valores. Para a assinatura como a referência do runtime a descreve, consulte Handlers.
fetch(request, env, ctx) em ES Modules
| Parâmetro | Tipo | Descrição |
|---|---|---|
request | Request | O objeto da requisição HTTP recebida |
env | Object | Variáveis de ambiente e bindings |
ctx | Object | Contexto de execução. Use ctx.waitUntil(promise) para estender o tempo de vida da função para tarefas assíncronas |
firewall(request, env, ctx) em ES Modules
| Parâmetro | Tipo | Descrição |
|---|---|---|
request | Request | O objeto da requisição HTTP recebida |
env | Object | Variáveis de ambiente e bindings |
ctx | Object | Contexto de execução. Chame ctx.deny() para bloquear a requisição imediatamente. Se ctx.deny() não for chamado, a requisição continua para o handler fetch |
O objeto de evento em Service Worker
| Propriedade | Descrição |
|---|---|
event.request | Acesso ao objeto Request |
event.deny() | Bloqueia a requisição imediatamente. Se não for chamado, a requisição continua para o handler fetch |
Migre o handler
A lógica permanece a mesma nos dois padrões. O que muda é onde o handler lê a requisição e onde ele retorna a resposta.
Migre o handler fetch
O listener vira um método fetch. A requisição chega como primeiro argumento e não como uma propriedade do evento.
O código Service Worker registra o listener e delega para uma função nomeada:
A versão ES Modules move a mesma lógica para o método fetch e retorna a resposta diretamente:
Migre o handler firewall
Três nomes mudam: o listener vira um método firewall, event.request vira request e event.deny() vira ctx.deny().
O código Service Worker lê os headers a partir do evento e bloqueia com event.deny():
A versão ES Modules lê os headers a partir de request e bloqueia com ctx.deny():
Use o contexto de execução
O argumento ctx carrega as duas chamadas que um handler ES Modules faz sobre a própria invocação.
Tire o trabalho assíncrono do caminho da resposta
ctx.waitUntil(promise) estende o tempo de vida da função para além da resposta. Passe para ele o trabalho cujo resultado a resposta não precisa:
Bloqueie requisições por path
O método firewall recebe a requisição inteira. O handler pode ler a URL e aplicar uma regra por path. Este handler bloqueia bots em todos os paths e restringe /admin a uma única faixa de endereços:
Padrões não suportados
Azion Runtime reporta Unsupported handler pattern detected quando o código não corresponde a nenhum dos padrões suportados. Três formatos produzem esse erro:
Os três falham no mesmo requisito: o export padrão precisa ser um objeto que carregue um método fetch. Reescreva o código no padrão ES Modules para resolver o erro. O padrão Service Worker também o resolve e Azion recomenda ES Modules para código novo.
Para falhas que o formato do handler não explica, consulte Solução de problemas de execução e logs de funções.