Skip to main content
Deno 2 is finally here 🎉️
Learn more

deno_msj_controllers

Realiza o tratamento de request em cadeia.

Configurando o Server

Este é o modelo de configuração do servidor:

import { BaseController, Context, PageController } from "./mod.ts";

const controllers = BaseController.enlistHandlers(
    PageController
);

const handler = async (request: Request): Promise<Response> => {
    const context = new Context(request);
    const response = await controllers.handle(context);
    return response;
};

Deno.serve(handler);

Neste modelo as controllers são encadeadas pelo BaseController.enlistHandlers, onde o tipo das controller são informados na ordem desejada de tratamento.

O objeto controllers resultante representa o primeiro nó da cadeia, e deve manupular o objeto context, a partir daí, o context será repassado em cadeia até a controller desejada encerrar as tratativas retornando uma Promise Response.

PageController

É uma controller responsável por servir arquivos contidos no diretório pages, criando assim um WebServer simples.

Caso um diretório seja solicitado na request o arquivo index.html deste diretório será retornado.

No caso de criação de novos diretórios dentro de pages as páginas deverão conter a tag base href = /[diretorio]/

Criando um novo controller

As demais controllers serão responsáveis pelas requestes realizadas em /api.

Abaixo segue um exemplo de uma controller que atende a resquests em /api/task

import { BaseController, Context } from "../mod.ts";

export default class TaskController extends BaseController {

    public async handle(context: Context): Promise<Response> {
        
        if(context.url.pathname !== "/api/task" || context.request.method !== "GET")
            return super.handle(context);

        await this.sleep(5000);
        
        const response = new Response("Task Concluída!", {status: 200, headers: { "content-type": "text/plain; charset=utf-8" }});
        return response;
    }

    private sleep(ms: number): Promise<void> {
        return new Promise(resolve => {
            setTimeout(() => {
                resolve()
            }, ms);
        });
    }

}

O método handle recebe o context, internamente verifica se a url e método serão atendidos por esta controller, se não, passa a request para a próxima controller da cadeira, se sim, realiza os trabalhos da controller e retorna uma response.

Caso nenhuma controller seja responsável pela request, um BadRequest será retornado.