Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development
Code

Conoce the Connect Framework

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Claudia Márquez (you can also view the original English article)

Los recién llegados a NodeJS suelen encontrar su API difícil de entender. Afortunadamente, muchos desarrolladores han creado marcos que facilitan el trabajo con Node.  Connect es uno de esos marcos. Se encuentra sobre la API de Node y traza la línea entre la comodidad y el control.

Piensa en Connect como una pila de middleware. Con cada solicitud, Connect filtra a través de las capas de middleware, cada una de ellas tiene la oportunidad de procesar la solicitud HTTP.  Cuando T.J. Holowaychuk anunció Connect, dijo que había dos tipos de middleware. El primero es un filtro.

Los filtros procesan la solicitud, pero no responden a ella (piense en el registro del servidor). 

El otro tipo es un proveedor que responde a la solicitud. Puede incorporar tantas capas de middleware como desee; la solicitud pasa a través de cada capa hasta que uno de los middleware responde a la solicitud.


Sintaxis básica

Primero, debe instalar el paquete Connect a través de npm:

Ahora crea un archivo server.js y agrega el siguiente código:

La variable de connect es una función que devuelve una nueva aplicación Connect. Entonces, nuestro siguiente paso es crear esa aplicación:

No necesita crear una variable de app para la mayoría de sus aplicaciones. Las funciones involucradas en la creación de una aplicación (connect () y use ()) son encadenables:

La función use() agrega una capa de middleware a la aplicación, y la función listen() le dice a nuestra aplicación que comience a aceptar conexiones en el puerto especificado (3000 en este ejemplo).

Comencemos con algo simple: iniciar sesión. El código para una aplicación Connect que usa solo el middleware de registro es bastante simple:

Por defecto, el nodo analiza muy poco de la solicitud entrante.

Agregue este código a su archivo e inicie el servidor ejecutando el nodeserver.js. Navega hacia cualquier ruta en tu navegador e ignora los resultados "No se puede OBTENER ...". No estamos interesados en lo que el servidor devuelve al navegador; estamos interesados en el registro del servidor. Mire la terminal y verá el registro de sus solicitudes. Asegúrese de consultar la documentación del registrador para obtener información sobre sus otras características y personalización.

Eso fue un filtro; ahora veamos a un proveedor. El proveedor más simple es el proveedor estático; sirve archivos estáticos de una carpeta especificada. Aquí está su sintaxis:

Probablemente puedas adivinar el propósito de la variable __dirname de Node: es la ruta al directorio actual. Este middleware sirve estadísticamente cualquier cosa desde una carpeta public en el directorio actual. Por lo tanto, cree public/page.html y agregue un elemento Reinicie el servidor (node server.js) y navegue a localhost:3000/page.html en su navegador. Debe page.html representado en el navegador.

Veamos ahora algunas de las otras opciones de middleware de Connect.


Análisis de cuerpos de solicitud  (Parsing Request Bodies)

De forma predeterminada, el nodo analiza muy poco de la solicitud entrante, pero puede incorporar varios filtros diferentes para analizar la solicitud si necesita manejar más complejidad. Hay cuatro filtros:

  • connect.json() analiza cuerpos de solicitud JSON (donde content-type es application/json).
  • connect.urlencoded() parse x-www-form-urlencoded  request bodies.
  • connect.multipart() parses multipart/form-datarequest bodies.
  • connect.bodyParser() es un atajo para habilitar los tres anteriores

El uso de cualquiera de estos filtros le da la capacidad de acceder a su cuerpo analizado a través de request.body (hablaremos sobre cómo obtener ese objeto de request pronto).

Creo que estos filtros son un buen ejemplo de cómo ajustar tu control con Connect. Puede usar muy poco procesamiento para optimizar su aplicación.


Analizando Cookies y Sesiones (Parsing Cookies and Sessions)

Las cookies y las sesiones son una parte importante de cualquier aplicación web, y hay varias piezas de middleware que ayudan a administrarlas.  Connect.cookieParser() analiza las cookies por usted y puede recuperar las cookies y sus valores a través del objeto request.cookies. Esto es más útil si agrega el filtro connect.session() a su aplicación. Este filtro requiere que el analizador de cookies ya esté en su lugar. Aquí hay un pequeño ejemplo:

Cada función de middleware que escriba debe pasar la solicitud a la next capa o responder a la solicitud.

Después de cookieParser, incluimos el filtro de sesión y le pasamos dos opciones:

  • El secret crea una cookie firmada que realiza un seguimiento de la sesión.
  • El cookie.maxAge define su lapso de vida en milisegundos; el 30000 en este código es de 30 segundos.

En la llamada de use() final, pasamos una función que responde a la solicitud. Usamos dos propiedades del objeto de requestreq.session para los datos de la sesión y req.url para la URL de la solicitud

Si la aplicación recibe una solicitud para /name/ ome_name, entonces almacena el valor some_name en req.session.name. Cualquier cosa almacenada dentro de una sesión puede ser recuperada en solicitudes posteriores para la duración de nuestra sesión. Cualquier solicitud hecha para /name/other reemplaza la variable de sesión, y cualquier solicitud a otras URL arroja el valor de la variable de sesión y el tiempo restante para la sesión.

Entonces, puedes navegar a localhost:3000/name/your_name, y luego ir a localhost:3000 para ver your_name. Actualiza la página unas cuantas veces y observa los segundos de la cuenta atrás. Cuando la sesión expire, verá el mensaje predeterminado "no stored name".

Mencioné que el filtro cookieParser debe venir antes de la session.

El orden de inclusión es importante con el middleware porque la solicitud se pasa, en orden, de una capa a otra. 

Debido a que la session necesita los datos de cookies analizados, la solicitud debe pasar por cookieParser antes de la session.

Podría explicar todas las demás piezas integradas de middleware, pero mencionaré algunas más antes de escribir nuestro propio código para interactuar con Connect.


Escribir su propio Middleware

Acabas de aprender a escribir tu propio código con Connect. Aquí está la sintaxis básica una vez más:

Los tres parámetros de la función son importantes; proporcionan acceso al mundo exterior. El parámetro req es, por supuesto, el objeto de solicitud, y res es la respuesta. El tercer parámetro, next, es la clave para crear funciones que funcionen bien en la pila de middleware. Es una función que pasa la solicitud al siguiente middleware en la pila. Mira este ejemplo:

Este código usa dos funciones de middleware. La primera función verifica el método de solicitud para ver si se trata de una solicitud POST. Si es así, responde diciendo eso.  De lo contrario, llamamos a next() y pasamos la solicitud a la siguiente función, que responde sin importar qué. Use curl para probar ambas capas en la terminal:

Si no te gusta la terminal, prueba este útil complemento de Chrome.

Es importante recordar que cada función de middleware que escriba debe pasar la solicitud a la next capa o responder a la solicitud. Si su función se bifurca (mediante declaraciones if u otras condicionales), debe asegurarse de que cada sucursal pase la solicitud o responda a ella. Si su aplicación se bloquea en el navegador, es probable que sea porque olvidó llamar a next() en algún momento.

Ahora, ¿qué hay de esos parámetros de request y response? Estos son los mismos objetos de solicitud y respuesta que recibe cuando utiliza un servidor de nodo "en bruto":

Si no ha usado la API del servidor de Node antes, déjeme mostrarle lo que puede hacer con ella.


El objeto de solicitud (The Request Object)

El objeto de request es en realidad un objeto http.IncomingMessage y sus propiedades importantes se enumeran a continuación :: 

  • req.method te dice qué método HTTP se utilizó.
  • req.url le dice qué URL fue solicitada.
  • req.headers es un objeto con los nombres y valores del encabezado.
  • req.query es un objeto con cualquier dato en una cadena de consulta (para analizar eso, necesitará el middleware connect.query() en su lugar).
  • req.body es un objeto de los datos del formulario (necesitará algún middleware de análisis del cuerpo en su lugar).
  • req.cookies es un objeto de los datos de cookie (requiere análisis de cookies).
  • req.session es un objeto de los datos de la sesión (de nuevo, necesitará analizar las cookies y el middleware de sesión en su lugar) 

Puede ver todo esto en funcionamiento con el siguiente código:

Para ver algo para cada uno de estos valores, debe publicar algunos datos en una URL con una cadena de consulta. Lo siguiente debería ser suficiente:

Con esas siete propiedades, puede administrar casi cualquier solicitud que reciba. No creo que los trailers se utilicen a menudo (nunca los he visto en mi experiencia), pero puedes usar req.trailers si los esperas en tus solicitudes (los trailers son solo como encabezados, pero después del cuerpo). 

Entonces, ¿qué hay de tu respuesta?


El objeto de respuesta (The Response Object)

El objeto de respuesta sin formato no proporciona los lujos que las bibliotecas (como Express) le ofrecen.  Por ejemplo, no puede responder con una simple llamada de renderizado a una plantilla prefabricada, al menos, no de forma predeterminada. Se asume muy poco en la respuesta, por lo que debe completar todos los pequeños detalles.

Comenzaremos con el código de estado y los encabezados de respuesta. Puede configurar estos todos a la vez con el método writeHead(). Aquí hay un ejemplo de los documentos del nodo:

Si necesita establecer encabezados individualmente, puede usar el método setHeader():

Agregue este código a un archivo, inicie el servidor y solicítelo desde el navegador. ¡Tienes HTML! Ahora ejecuta:

Y recibirás texto sin formato. Para JSON, intente esto:

¡Todo desde la misma URL!

Utilice res.getHeader(name) si necesita saber qué encabezados ya se han configurado. También puede usar res.removeHeader(name) para eliminar un encabezado.

Por supuesto, una respuesta es inútil sin un cuerpo. Cómo ha visto a lo largo de este tutorial, puede escribir fragmentos de datos en el cuerpo con el método res.write(). Esto acepta una cadena o un objeto de buffer como argumento. Si se trata de una cadena, el segundo parámetro es el tipo de codificación (por defecto es utf8).

El método res.end() cierra el cuerpo, pero puede pasarle datos para escribir en la secuencia de respuesta. Esto es útil en situaciones donde solo necesita generar una sola línea.


Middleware de terceros

Es algo difícil responder con cuerpos de HTML más grandes en el antiguo nodo normal y Connect. Este es un buen lugar para incluir middleware de terceros en la mezcla.  Puede encontrar una lista de middleware de terceros en la wiki Connect Github. Como ejemplo, vamos a usar el paquete connect-jade, que nos permite representar vistas de jade.

Primero, instale connect-jade:

A continuación, solicite y agréguelo como middleware. Querrá establecer algunos valores predeterminados:

Establezca la raíz como el directorio que contiene los archivos de vista. También puede establecer los valores defaults; estas son variables que están disponibles dentro de cada vista, a menos que las anulemos más adelante al llamar a render().

La función final de este código realiza una llamada a res.render(). Este método es proporcionado por el paquete connect-jade.

El primer argumento que acepta es el nombre de la vista a renderizar.

Es el camino a la vista, sin la ruta que definimos al agregar el sans middleware, sin la extensión sans de archivo de jade. Para este código, necesitamos una plantilla views/index.jade para renderizar. Lo mantendremos simple: 

Si no está familiarizado con jade, sangramos los nombres de las etiquetas para crear una estructura HTML. El signo igual recupera el valor de una variable de JavaScript. Esas variables provienen de los valores defaults que configuramos, más el segundo parámetro (opcional) objeto pasado a res.render().

Hay muchos middlewares de terceros, pero funcionan de forma similar. Usted los instala a través de npm, los requiere y los pone en acción.


Módulos como Middleware

Si investigas cómo funciona Connect, verás que cada capa es en realidad un módulo Node, un diseño muy inteligente. Si usa Connect para aplicaciones considerables, sería ideal escribir su código en formato de módulo Node. Es posible que tenga un archivo app.js como este:

Y en tu server.js


Conclusión

Si desea una biblioteca para principiantes que facilite la creación de grandes aplicaciones web, Connect no es su solución. Connect pretende ser una capa delgada en la parte superior de la API de nodo sin formato que le da control total sobre su aplicación de servidor. Si quiere un poco más, te recomiendo Express (por la misma gente, por cierto). De lo contrario, Connect es una fantástica biblioteca extensible para aplicaciones web Node.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.