Midmare - módulo Node.js sin HTTP-Layer

Midmare es una biblioteca de código abierto minimalista. Lo escribí en bastante poco tiempo para optimizar procesos específicos en mi empresa. Pero como resultado, fue posible llegar a una solución, cuyo potencial excede significativamente la idea original.



En este artículo hablaré sobre las características y capacidades de Midmare , además de compartir mi experiencia en la creación de su propia biblioteca.



Antecedentes



El producto con el que estoy trabajando se encuentra actualmente en proceso de migración. Hasta que termine, existimos en paralelo en dos plataformas y nos alejamos del legado. Estoy haciendo un backend de aplicación web para una nueva plataforma. Algunos procesos deben estar constantemente unificados con otros equipos.



Teniendo en cuenta estas características, era necesario encontrar una solución flexible y universal para reescribir el backend existente. Esta solución fue la biblioteca Midmare.



Tareas introductorias



Tuve la tarea de hacerlo de modo que la biblioteca se pueda usar tanto con TypeScript como con JavaScript. Al mismo tiempo, el equipo tenía como objetivo reescribir completamente el código de TS a JS para acelerar el desarrollo.



JS no está escrito, por lo que el desarrollo es mucho más rápido con él, aunque menos estable. Estábamos dispuestos a correr los riesgos que habíamos planeado para protegernos escribiendo suficientes pruebas.



Al principio, durante una semana y media, pensé en el concepto, pasé por diferentes opciones. Hasta que llegué a la idea de que sería genial usar un enfoque funcional para que fuera posible insertar cualquier eslabón en cualquier cadena de ejecución sin consecuencias.



Se me ocurrió la idea de usar middleware.



Es decir, realizar una cadena de funciones de procesamiento intermedias que se ejecutan una tras otra y reaccionan a los errores de las demás (errores, problemas, cambios de datos, etc.).



Así que obtuve una pila de middleware, que en principio es similar a Koa. Esta similitud asegura que el resto de la biblioteca sea fácil de usar. Pero en Midmare hay muchos menos métodos, solo 4. La biblioteca Midmare en sí es minimalista.



Inicio de obra



Antes de instalar Midmare, debe descargar e instalar Node.js versión 10 o superior. Al crear un nuevo proyecto, también debe crear package.json con el comando npm init primero .



La instalación de Midmare se realiza mediante el comando npm install midmare .



A continuación se muestra una inicialización de la aplicación de muestra.





Inicialización general de aplicaciones en Midmare con





enrutadores (middleware a nivel de enrutador)



Características de midmare



En primer lugar, estamos hablando de las impresionantes capacidades de descomposición de código. Es posible que las funciones intermedias (middleware) no sepan nada unas de otras. Simplemente toman datos, los procesan y los publican más.



La biblioteca Midmare es ideal cuando necesita utilizar el mismo sistema de enrutamiento para diferentes API: origen y destino. Es decir, cuando necesite crear un determinado nodo de procesamiento común. Pero también puede crear aplicaciones más sencillas.



A continuación se muestran algunos ejemplos para resaltar las capacidades de Midmare.





Detectando errores usando una función intermedia. También es un ejemplo de descomposición de código





Una función intermedia simple que cierra una sesión HTTP en caso de discrepancia de ruta





Un ejemplo de procesamiento de un comando, en este caso, enviar datos a Redis



La pequeña biblioteca hace su pequeño trabajo, pero no limita las opciones disponibles para usted de ninguna manera. En Midmare, puede conectar prácticamente cualquier cosa, sin tener que preocuparse por cómo construir una arquitectura.



Ventaja clave



La ventaja clave de esta biblioteca es el aislamiento completo de cualquier capa (HTTP, WS, etc.). Si Koa está diseñado para un servidor HTTP, Midmare no crea restricciones a este respecto.



Incluso puede escribir una utilidad de terminal. Con Midmare, esto es conveniente ya que podemos usar parámetros en path. Como en el siguiente ejemplo:







Con Midmare, puede volver al mismo servidor HTTP. No será difícil conectarlo. Ya existe un enrutador listo para usar para HTTP .



Con esto, también puede conectar WebSockets de forma segura. Solo necesita inicializar el cliente de WebSockets. Y luego depende del enrutamiento más simple.





Ejemplo de combinación de HTTP y WebSockets con Midmare



Esta versatilidad elimina la necesidad de pensar en diferentes formas de resolver el mismo problema en un programa.



De hecho, es bastante difícil enumerar todas las posibilidades de implementación, porque cualquier idea es aplicable a la biblioteca sin restricciones.



No he visto bibliotecas listas para usar de este formato



Es decir, un análogo completo: sin enlaces de bajo nivel, ya sea WebSockets, HTTP o, más en general, comunicación de red o software que funcione en el propio sistema operativo.



Midmare puede hacerlo todo al mismo tiempo y literalmente en 5-6 líneas de afinación.



Y la idea detrás de esto es bastante simple: construir una cadena de ejecución de funciones usando el método next / send para llamar. Si no necesita llamar más, el programa se detendrá. Más enrutamiento, menos HTTP, y tenemos Midmare.



¿Por qué utilizar esta biblioteca?



Siempre puedes escribir tu propia solución. Por supuesto, en este caso, su descomposición o el código en sí pueden ser poco convincentes (por ejemplo, es posible que no pueda interponerse entre los pasos de la cadena). Si hay muchos de esos defectos, un programa escrito a mano puede tener un mal final en uno o dos años. Midmare evita esto.



Además, hay demasiados filtros en el mundo de los programadores. Alguien quiere escribir en TypeScript, alguien en JS. Estaba buscando una solución para capturar ambas opciones.





Ahora intento probar y perfeccionar Midmare de forma activa.



Una gran ventaja de una biblioteca pequeña es que su creador la apoya activamente.



Pruebo mi biblioteca todos los días y, en consecuencia, encuentro rápidamente trampas o fallas. Con una pequeña biblioteca, cualquier problema se puede solucionar en poco tiempo.



Las llamadas cíclicas son el primero de los problemas solucionados



Veamos el siguiente ejemplo:







Digamos que necesitamos agregar una llamada '/ send' al paso .process ('/ message'), pero .process ('/ send') ya contiene una llamada '/ message'. Luego, el Paso # 2 llamará al Paso # 1. Al mismo tiempo, en el Paso # 1, la llamada al Paso # 2 se activará cada vez, y así sucesivamente en un círculo.



Cuando trabajas en la creación de una biblioteca, necesitas detectar estos problemas, mostrárselos a los usuarios y explicar de qué está lleno.



En este caso, obtendremos el error de tamaño máximo de pila de llamadas excedido y JS caerá en respuesta a múltiples llamadas recursivas a la misma función.



La solución a este problema en esta biblioteca es: Mantener el historial de rutas en un contexto. Es decir, cada llamada a `ctx.send` o ʻapp.send` tiene su propio historial de llamadas.



Dado que Midmare tiene un control en este punto, la biblioteca arrojará un error si se llama en un bucle.



Puede haber una situación en la que se necesite una llamada circular. Por ejemplo, dos funciones intermedias manejan los mismos datos de manera diferente porque existe la posibilidad de romper el ciclo. Es decir, cuando una de las funciones contiene un if-else, que funcionará en el else e ignorará la llamada cíclica.



En caso de que la implementación requiera un ciclo, Midmare tiene una opción para configurar el error para ignorarlo mediante ʻignoreCycleError: true`.







La biblioteca espera a su comunidad



En principio, no tiene sentido agregar nada a una biblioteca tan pura. Sería bueno agregar la capacidad de conectar complementos, pero con middleware esto se puede resolver sin una nueva funcionalidad.



Si en un caso particular falta algún procesamiento, puede agregarlo usted mismo a las 4 líneas condicionales. Como en el ejemplo con la función para cerrar la sesión HTTP:







Todo el procesamiento adicional se puede mover a un repositorio separado. O distribuir enrutadores a repositorios. Todo se conectará y procesará de la misma manera.



Lo que la biblioteca realmente haría bien por ahora es una comunidad que construiría sus propias herramientas a partir de la biblioteca. Por eso, invito a la comunidad a contribuir al desarrollo de la biblioteca. Únase y pruebe.



Autor:Ivan Petushinsky, desarrollador sénior de Node.js



All Articles