Dans cet article, je parlerai des fonctionnalités et des capacités de Midmare , ainsi que de mon expérience dans la création de votre propre bibliothèque.
Contexte
Le produit avec lequel je travaille est actuellement en cours de migration. Jusqu'à ce que ce soit fini, nous existons en parallèle sur deux plates-formes et nous nous éloignons de l'héritage. Je fais un backend d'application web pour une nouvelle plateforme. Certains processus doivent être constamment unifiés avec d'autres équipes.
Compte tenu de ces fonctionnalités, il était nécessaire de trouver une solution flexible et universelle pour réécrire le backend existant. Cette solution était la bibliothèque Midmare.
Tâches introductives
J'avais une tâche pour faire en sorte que la bibliothèque puisse être utilisée à la fois avec TypeScript et JavaScript. Dans le même temps, l'équipe avait pour objectif de réécrire complètement le code de TS vers JS pour accélérer le développement.
JS n'est pas typé, donc le développement est beaucoup plus rapide avec lui, bien que moins stable. Nous étions prêts à prendre de tels risques car nous avions prévu de nous protéger en écrivant suffisamment de tests.
Au début, pendant une semaine et demie, j'ai réfléchi au concept, je suis passé par différentes options. Jusqu'à ce que j'en vienne à l'idée qu'il serait cool d'utiliser une approche fonctionnelle pour qu'il soit possible d'insérer n'importe quel maillon dans n'importe quelle chaîne d'exécution sans conséquences.
J'ai eu l'idée d'utiliser un middleware
A savoir, faire une chaîne de fonctions de traitement intermédiaires qui s'exécutent les unes après les autres et réagissent aux erreurs de l'autre (erreurs, problèmes, changements de données, etc.).
J'ai donc eu une pile de middleware, qui est en principe similaire à Koa. Cette similitude garantit que le reste de la bibliothèque est facile à utiliser. Mais à Midmare, il y a beaucoup moins de méthodes, seulement 4. La bibliothèque Midmare elle-même est minimaliste.
Début des travaux
Avant d'installer Midmare, vous devez télécharger et installer Node.js version 10 ou supérieure. Lors de la création d'un nouveau projet, vous devez également créer d'abord package.json avec la commande npm init .
L'installation de Midmare se fait via la commande npm install midmare .
Voici un exemple d'initialisation d'application.
Initialisation générale des applications sur Midmare à l' aide de routeurs
(middleware au niveau du routeur)
Fonctionnalités Midmare
Tout d'abord, nous parlons des capacités impressionnantes de décomposition de code. Les fonctions intermédiaires (middleware) peuvent ne rien savoir les unes des autres. Ils prennent simplement des données, les traitent et les libèrent davantage.
La bibliothèque Midmare est idéale lorsque vous devez utiliser le même système de routage pour différentes API - source et destination. Autrement dit, lorsque vous devez créer un certain nœud de traitement commun. Mais vous pouvez également créer des applications plus simples.
Voici quelques exemples pour mettre en évidence les capacités de Midmare.
Attraper les erreurs à l'aide d'une fonction intermédiaire. Il est aussi un exemple de décomposition de code
Une simple fonction intermédiaire qui ferme une session HTTP en cas de discordance de route
Un exemple de traitement d'une commande, dans ce cas, l'envoi de données à Redis
La petite bibliothèque fait son petit travail, mais elle ne limite en aucune façon les options qui s'offrent à vous. Dans Midmare, vous pouvez connecter pratiquement n'importe quoi - sans vous demander comment construire une architecture.
Avantage clé
Le principal avantage de cette bibliothèque est une isolation complète de toutes les couches (HTTP, WS, etc.). Si Koa est conçu pour un serveur HTTP, Midmare ne crée pas de restrictions à cet égard.
Vous pouvez même simplement écrire un utilitaire de terminal. Avec Midmare, c'est pratique car nous pouvons utiliser des paramètres dans
path
. Comme dans l'exemple ci-dessous:
En utilisant Midmare, vous pouvez revenir au même serveur HTTP. Il ne sera pas difficile de le connecter. Il existe déjà un routeur prêt à l'emploi pour HTTP .
Avec cela, vous pouvez également connecter en toute sécurité des WebSockets. Il vous suffit d'initialiser le client WebSockets lui-même. Et puis c'est au routage le plus simple.
Exemple de combinaison de HTTP et WebSockets avec Midmare
Cette polyvalence élimine le besoin de réfléchir à différentes façons de résoudre le même problème dans un programme.
En fait, il est assez difficile de lister toutes les possibilités d'implémentation, car sans restrictions toute idée peut être appliquée à la bibliothèque.
Je n'ai pas vu de bibliothèques prêtes à l'emploi de ce format
Autrement dit, un analogue complet: sans liaisons de bas niveau, que ce soit WebSockets, HTTP ou, plus généralement, la communication réseau ou le logiciel fonctionne dans l'OS lui-même.
Midmare peut tout faire en même temps et littéralement en 5-6 lignes de réglage.
Et l'idée derrière tout cela est assez simple: construire une chaîne d'exécution de fonctions en utilisant la méthode next / send à appeler. Si rien ne doit plus être appelé, le programme s'arrêtera. Plus le routage, moins HTTP - et nous avons Midmare.
Pourquoi utiliser cette bibliothèque?
Vous pouvez toujours rédiger votre propre solution. Bien sûr, dans ce cas, votre décomposition ou le code lui-même peut être boiteux (par exemple, vous ne pourrez peut-être pas vous coincer entre les étapes de la chaîne). S'il y a beaucoup de ces défauts, alors un programme écrit à la main peut se terminer mal dans un an ou deux. Midmare évite cela.
De plus, il y a trop de filtres dans le monde des programmeurs. Quelqu'un veut écrire en TypeScript, quelqu'un en JS. Je cherchais une solution pour capturer les deux options.
J'essaye maintenant de tester et d'affiner activement Midmare.
Un gros plus d'une petite bibliothèque est que son créateur la soutient activement.
Je teste ma bibliothèque tous les jours et, en conséquence, je trouve rapidement des pièges ou des défauts. Avec une petite bibliothèque, tout problème peut être résolu en un rien de temps.
Les appels cycliques sont le premier des problèmes résolus
Jetons un coup d'œil à l'exemple ci-dessous:
Disons que nous devons ajouter un appel '/ send' à l'étape .process ('/ message'), mais .process ('/ send') contient déjà un appel '/ message'. Ensuite, l'étape 2 appellera l'étape 1. En même temps, à l'étape 1, l'appel à l'étape 2 sera déclenché à chaque fois - et ainsi de suite dans un cercle.
Lorsque vous travaillez sur la création d'une bibliothèque, vous devez détecter de tels problèmes, les montrer aux utilisateurs, expliquer en quoi ils sont chargés.
Dans ce cas, nous obtiendrons l'erreur de dépassement de la taille maximale de la pile des appels et JS plantera en réponse à plusieurs appels récursifs à la même fonction.
La solution à ce problème dans cette bibliothèque est la suivante: Stocker l'historique des chemins dans un contexte. Autrement dit, chaque appel à `ctx.send` ou ʻapp.send` a son propre historique d'appels.
Puisque Midmare a une poignée sur ce point, la bibliothèque lancera une erreur si elle est appelée dans une boucle.
Il peut y avoir une situation dans laquelle un appel circulaire est nécessaire. Par exemple, deux fonctions intermédiaires traitent les mêmes données différemment car il y a une possibilité de sortir de la boucle. Autrement dit, lorsqu'une des fonctions contient un if-else, qui fonctionnera dans le else et ignorera l'appel cyclique.
Dans le cas où l'implémentation nécessite un cycle, Midmare a une option pour définir l'erreur à ignorer via ʻignoreCycleError: true`.
La bibliothèque attend sa communauté
En principe, cela n'a aucun sens d'ajouter quoi que ce soit à une bibliothèque aussi pure. Ce serait bien d'ajouter la possibilité de connecter des plugins, mais avec le middleware, cela peut être résolu sans nouvelle fonctionnalité.
Si dans un cas particulier un traitement manque, vous pouvez l'ajouter vous-même aux 4 lignes conditionnelles. Comme dans l'exemple avec la fonction de fermeture de la session HTTP:
Tous les traitements supplémentaires peuvent être déplacés vers un référentiel séparé. Ou pour distribuer des routeurs vers des référentiels. Tout sera connecté et traité de la même manière.
Ce que la bibliothèque ferait vraiment bien pour le moment, c'est une communauté qui créerait ses propres outils à partir de la bibliothèque. Par conséquent, j'invite la communauté à contribuer au développement de la bibliothèque. Rejoignez et testez.
Auteur:Ivan Petushinsky, développeur senior Node.js