Midmare - módulo Node.js gratuito da camada HTTP

Midmare é uma biblioteca minimalista de código aberto. Eu o escrevi em um tempo relativamente curto para otimizar processos específicos em minha empresa. Mas, como resultado, foi possível chegar a uma solução, cujo potencial excede significativamente a ideia original.



Neste artigo falarei sobre os recursos e capacidades do Midmare , bem como compartilharei minha experiência na criação de sua própria biblioteca.



fundo



O produto com o qual estou trabalhando está passando por um processo de migração. Até que isso acabe, existimos em paralelo em duas plataformas e nos distanciamos do legado. Estou fazendo um back-end de aplicativo da web para uma nova plataforma. Alguns processos precisam ser constantemente unificados com outras equipes.



Levando esses recursos em consideração, foi necessário encontrar uma solução flexível e universal para reescrever o back-end existente. Essa solução foi a biblioteca Midmare.



Tarefas introdutórias



Tive a tarefa de fazer com que a biblioteca pudesse ser usada com TypeScript e JavaScript. Ao mesmo tempo, a equipe pretendia reescrever completamente o código de TS para JS para acelerar o desenvolvimento.



JS não é digitado, então o desenvolvimento é muito mais rápido com ele, embora menos estável. Estávamos dispostos a correr riscos, pois planejávamos nos proteger escrevendo testes suficientes.



No início, durante uma semana e meia, pensei no conceito, passei por diferentes opções. Até que cheguei à ideia de que seria legal usar uma abordagem funcional para que fosse possível inserir qualquer elo em qualquer cadeia de execução sem consequências.



Tive a ideia de usar middleware



Ou seja, para fazer uma cadeia de funções de processamento intermediárias que são executadas uma após a outra e reagem aos erros umas das outras (erros, problemas, alterações de dados, etc.).



Portanto, obtive uma pilha de middleware, que em princípio é semelhante ao Koa. Essa semelhança garante que o resto da biblioteca seja fácil de usar. Mas no Midmare existem significativamente menos métodos, apenas 4. A própria biblioteca do Midmare é minimalista.



Começo do trabalho



Antes de instalar o Midmare, você precisa baixar e instalar o Node.js versão 10 ou superior. Ao criar um novo projeto, você também precisa criar o package.json com o comando npm init primeiro .



A instalação do Midmare é feita por meio do comando npm install midmare .



Abaixo está um exemplo de inicialização de aplicativo.





Inicialização geral do aplicativo no Midmare usando roteadores





(middleware de nível de roteador)



Recursos do Midmare



Em primeiro lugar, estamos falando sobre os impressionantes recursos de decomposição de código. As funções intermediárias (middleware) podem não saber nada sobre as outras. Eles apenas pegam os dados, processam e liberam mais tarde.



A biblioteca Midmare é ideal quando você precisa usar o mesmo sistema de roteamento para diferentes APIs - origem e destino. Ou seja, quando você precisa criar um determinado nó de processamento comum. Mas você também pode criar aplicativos mais simples.



Aqui estão alguns exemplos para destacar os recursos do Midmare.





Captura de erros usando uma função intermediária. É também um exemplo de decomposição de código





Uma função intermediária simples que fecha uma sessão HTTP em caso de incompatibilidade de rota





Um exemplo de processamento de um comando, neste caso, o envio de dados para o Redis



A pequena biblioteca faz seu pequeno trabalho, mas não limita as opções disponíveis para você de forma alguma. No Midmare, você pode conectar virtualmente qualquer coisa - sem se preocupar em como construir uma arquitetura.



Vantagem chave



A principal vantagem desta biblioteca é o isolamento completo de quaisquer camadas (HTTP, WS, etc.). Se Koa for projetado para um servidor HTTP, o Midmare não cria restrições a esse respeito.



Você pode até mesmo escrever um utilitário de terminal. Com o Midmare, isso é conveniente, pois podemos usar parâmetros em path. Como no exemplo abaixo:







Usando Midmare, você pode voltar para o mesmo servidor HTTP. Não será difícil conectá-lo. Já existe um roteador pronto para HTTP .



Com isso, você também pode conectar WebSockets com segurança. Você só precisa inicializar o próprio cliente WebSockets. E então depende do roteamento mais simples.





Exemplo de combinação de HTTP e WebSockets com Midmare



Essa versatilidade elimina a necessidade de pensar em maneiras diferentes de resolver o mesmo problema em um programa.



Na verdade, é bastante difícil listar todas as possibilidades de implementação, porque sem restrições qualquer ideia pode ser aplicada à biblioteca.



Eu não vi bibliotecas prontas deste formato



Ou seja, um análogo completo: sem vínculos de baixo nível, sejam WebSockets, HTTP ou, mais geralmente, comunicação de rede ou software funcionam no próprio sistema operacional.



O Midmare pode fazer tudo ao mesmo tempo e literalmente em 5-6 linhas de afinação.



E a ideia por trás disso é bastante simples - construir uma cadeia de execução de funções usando o método next / send para chamar. Se nada mais precisar ser chamado, o programa será interrompido. Mais o roteamento, menos o HTTP - e temos o Midmare.



Por que usar esta biblioteca?



Você sempre pode escrever sua própria solução. Claro, neste caso, sua decomposição ou o próprio código podem ser coxos (por exemplo, você pode não ser capaz de se colocar entre as etapas da cadeia). Se houver muitas dessas falhas, um programa escrito à mão pode acabar mal em um ou dois anos. Midmare evita isso.



Além disso, existem muitos filtros no mundo dos programadores. Alguém quer escrever em TypeScript, alguém em JS. Eu estava procurando uma solução para capturar as duas opções.





Agora tento testar e refinar ativamente o Midmare.Uma



grande vantagem de uma pequena biblioteca é que seu criador a suporta ativamente.



Eu testo minha biblioteca todos os dias e, consequentemente, encontro rapidamente armadilhas ou falhas. Com uma pequena biblioteca, qualquer problema pode ser resolvido em nenhum momento.



As chamadas cíclicas são o primeiro dos problemas corrigidos



Vejamos o exemplo abaixo:







Digamos que precisamos adicionar uma chamada '/ send' à etapa .process ('/ message'), mas .process ('/ send') já contém uma chamada '/ message'. Então, a Etapa 2 chamará a Etapa 1. Nesse caso, na Etapa 1, a chamada para a Etapa 2 será acionada a cada vez - e assim por diante em um círculo.



Quando você trabalha na criação de uma biblioteca, precisa detectar esses problemas, mostrá-los aos usuários e explicar do que eles estão envolvidos.



Nesse caso, obteremos o erro Tamanho máximo da pilha de chamadas excedido e o JS cairá em resposta a várias chamadas recursivas para a mesma função.



A solução para este problema nesta biblioteca é: Armazenar histórico de caminhos em um contexto. Ou seja, cada chamada para `ctx.send` ou ʻapp.send` tem seu próprio histórico de chamadas.



Como o Midmare tem um identificador neste ponto, a biblioteca lançará um erro se for chamada em um loop.



Pode haver uma situação em que uma chamada circular seja necessária. Por exemplo, duas funções intermediárias tratam os mesmos dados de maneira diferente porque existe a possibilidade de quebrar o loop. Ou seja, quando uma das funções contém um if-else, que funcionará no else e ignorará a chamada cíclica.



Caso a implementação exija um ciclo, Midmare tem uma opção para definir o erro para ignorar via ʻignoreCycleError: true`.







A biblioteca está esperando por sua comunidade



Em princípio, não faz sentido adicionar nada a uma biblioteca tão pura. Seria bom adicionar a capacidade de conectar plug-ins, mas com o middleware isso pode ser resolvido sem novas funcionalidades.



Se em um caso particular algum processamento estiver faltando, você mesmo pode adicioná-lo às 4 linhas condicionais. Como no exemplo com a função para fechar a sessão HTTP:







Todo o processamento adicional pode ser movido para um repositório separado. Ou para distribuir roteadores para repositórios. Tudo será conectado e processado da mesma maneira.



O que a biblioteca realmente gostaria de fazer agora é uma comunidade que construiria suas próprias ferramentas a partir da biblioteca. Portanto, convido a comunidade a contribuir para o desenvolvimento da biblioteca. Participe e teste.



Autor:Ivan Petushinsky, desenvolvedor sênior de Node.js



All Articles