Los recién llegados a NodeJS generalmente encuentran que su API es difícil de entender. Afortunadamente, muchos desarrolladores han creado marcos que facilitan el trabajo con Node. Conectar es uno de esos marcos. Se encuentra en la parte superior de la API de Node y traza la línea entre la comodidad y el control.
Piense en Connect como una pila de middleware. Con cada solicitud, Connect se filtra a través de las capas de middleware, cada una con 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 filtrar.
Los filtros procesan la solicitud, pero no responden (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.
Primero, necesita instalar el paquete Connect a través de npm:
npm install connect
Ahora crea un server.js
archivo, y agregue el siguiente código:
var connect = require ("connect");
los conectar
variable es una función que devuelve una nueva aplicación Connect. Entonces, nuestro siguiente paso es crear esa aplicación:
var app = connect ();
No necesitas crear un aplicación
Variable para la mayoría de sus aplicaciones. Las funciones involucradas en la creación de una aplicación (conectar()
y utilizar()
) son chainable:
connect () .use (/ * middleware * /) .use (/ * middleware * /) .listen (3000);
los utilizar()
función agrega una capa de middleware a la aplicación, y la escucha()
La función le dice a nuestra aplicación que comience a aceptar conexiones en el puerto especificado (3000 en este ejemplo).
Vamos a empezar con algo simple: el registro. El código para una aplicación Connect que usa solo el middleware de registro es bastante simple:
connect () .use (connect.logger ()) .listen (3000);
Por defecto, Node analiza muy poco de la solicitud entrante.
Agregue ese código a su archivo e inicie el servidor ejecutando nodo server.js
. Vaya a cualquier ruta en su navegador e ignore los resultados "No se puede obtener ...". No estamos interesados en lo que el servidor envió de vuelta 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 echemos un vistazo 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:
.use (connect.static (__ dirname + "/ public")
Probablemente puedas adivinar el propósito de Node. __dirname
variable: es la ruta al directorio actual. Este middleware sirve estáticamente cualquier cosa desde un público
carpeta en el directorio actual. Entonces, crea public / page.html
y agrega un elemento. Reinicie el servidor
nodo server.js
), y vaya a localhost: 3000 / page.html
en tu navegador Debieras page.html
renderizado en el navegador.
Veamos ahora algunas de las otras opciones de middleware de Connect..
De forma predeterminada, Node analiza muy poco de la solicitud entrante, pero puede incorporar varios filtros diferentes para analizar la solicitud si necesita manejar una mayor complejidad. Hay cuatro filtros:
connect.json ()
analiza los cuerpos de solicitud JSON (donde tipo de contenido
es aplicación / json
).connect.urlencoded ()
analiza x-ww-form-urlencoded
cuerpos de solicitud.connect.multipart ()
analiza multipart / form-data
cuerpos de solicitud.connect.bodyParser ()
es un atajo para habilitar los tres anteriores.El uso de cualquiera de estos filtros le brinda la posibilidad de acceder a su cuerpo analizado a través de request.body
(Hablaremos sobre cómo conseguir eso solicitud
objeto pronto).
Creo que estos filtros son un buen ejemplo de cómo ajustar su control con Connect. Puede utilizar muy poco procesamiento para agilizar su aplicación.
Las cookies y las sesiones son una parte importante de cualquier aplicación web, y hay varias piezas de middleware que ayudan a administrarlas. los connect.cookieParser ()
analiza las cookies para usted, y puede recuperar las cookies y sus valores, a través de la request.cookies
objeto. Esto es más útil si agrega el connect.session ()
filtrar a su aplicación. Este filtro requiere que el analizador de cookies ya esté en su lugar. Aquí hay un pequeño ejemplo:
connect () .use (connect.cookieParser ()) .use (connect.session (secreto: 'texto secreto', cookie: maxAge: 30000)) .use (function (req, res) var sess = req.session, url = req.url.split ("/"); if (url [1] == "nombre" && url [2]) sess.name = url [2]; res.end (" nombre guardado: "+ url [2]); else if (sess.name) res.write (" nombre almacenado en la sesión: "+ sess.name); res.end (" almacenado para otro: "+ (sess .cookie.maxAge / 1000) + "segundos"); else res.end ("sin nombre almacenado; vaya a / nombre / nombre para guardar un nombre");). listen (3000);
Cada función de middleware que escriba necesita pasar la solicitud a la
siguiente
capa o responder a la solicitud.
Después de la cookieParser
, incluimos el sesión
Filtrar y pasarle dos opciones:
secreto
crea una cookie firmada que realiza un seguimiento de la sesión.cookie.maxAge
define su vida útil en milisegundos; El 30000 en este código es de 30 segundos..En la final utilizar()
llamada, pasamos una función que responde a la solicitud. Utilizamos dos propiedades de la solicitud
objeto: req.session
para datos de sesión, y req.url
para la URL de solicitud.
Si la solicitud recibe una solicitud de / name / some_name
, entonces almacena el valor some_name
en req.session.name
. Cualquier cosa almacenada dentro de una sesión puede ser recuperada en solicitudes subsiguientes por la duración de nuestra sesión. Cualquier petición hecha para / nombre / otro
reemplaza la variable de sesión, y cualquier solicitud a otras URL genera el valor de la variable de sesión y el tiempo restante para la sesión.
Por lo tanto, puede navegar a localhost: 3000 / nombre / tu nombre
, y luego ir a localhost: 3000
para ver tu nombre
. Actualiza la página unas cuantas veces y observa la cuenta regresiva de los segundos. Cuando la sesión caduque, verá el mensaje predeterminado "sin nombre almacenado".
Mencioné que el cookieParser
el filtro debe venir antes sesión
.
El orden de inclusión es importante con el middleware porque la solicitud se pasa, en orden, de capa a capa.
Porque sesión
necesita los datos de la cookie analizados, la solicitud debe pasar por cookieParser
antes de sesión
.
Podría explicar cada otra pieza de middleware incorporada, pero solo mencionaré algunas más antes de escribir nuestro propio código para interactuar con Connect.
Acabas de aprender a escribir tu propio código con Connect. Aquí está la sintaxis básica una vez más:
.usar (función (req, res, next) )
Los tres parámetros de la función son importantes; Proporcionan acceso al mundo exterior. los req
parámetro es, por supuesto, el objeto de solicitud, y res
es la respuesta El tercer parametro, siguiente
, es la clave para hacer que las funciones funcionen bien en la pila de middleware. Es una función que pasa la solicitud al siguiente middleware en la pila. Vea este ejemplo:
connect () .use (function (req, res, next) if (req.method === 'POST') res.end ("Esta es una solicitud POST"); else next (); ) .use (función (req, res) res.end ("Esta no es una solicitud POST (probablemente una solicitud GET)");). listen (3000);
Este código utiliza dos funciones de middleware. La primera función verifica el método de solicitud para ver si es una solicitud POST. Si es así, responde diciéndolo. De lo contrario, llamamos siguiente()
y pase la solicitud a la siguiente función, que responde sin importar qué. Utilizar rizo
Para probar ambas capas en el terminal:
$ curl http: // localhost: 3000 Esto no es una solicitud POST (probablemente una solicitud GET) $ curl -X POST http: // localhost: 3000 Esta es una solicitud POST
Si no te gusta el terminal, prueba este útil complemento de Chrome.
Es importante recordar que cada función de middleware que escriba necesita pasar la solicitud a la siguiente
Capa o responder a la solicitud. Si su función se bifurca (a través de sentencias if u otros condicionales), debe asegurarse de que cada sucursal pase la solicitud o responda a ella. Si su aplicación se cuelga en el navegador, probablemente se deba a que olvidó llamar siguiente()
en algún momento.
Ahora, ¿qué pasa con esos solicitud
y respuesta
parámetros? Estos son los mismos objetos de solicitud y respuesta que recibe cuando usa un servidor Nodo "sin procesar":
require ("http"). createServer (function (req, res) //…). listen (3000);
Si no ha utilizado la API del servidor de Node anteriormente, permítame mostrarle lo que puede hacer con ella.
los solicitud
objeto es en realidad un http.IncomingMessage
objeto, y sus propiedades importantes se enumeran a continuación:
método req.
te dice qué método HTTP se utilizó.req.url
te dice que URL fue solicitada.req.headers
Es un objeto con los nombres y valores del encabezado..pregunta
es un objeto con cualquier dato en una cadena de consulta (para analizar eso, necesitará el connect.query ()
middleware en su lugar).req.body
es un objeto de los datos del formulario (necesitará un middleware de análisis del cuerpo en su lugar).req.cookies
es un objeto de los datos de la cookie (requiere el análisis de cookies).req.session
es un objeto de los datos de la sesión (de nuevo, necesitará un análisis de cookies y un middleware de sesión en su lugar)Puedes ver todo esto en funcionamiento con el siguiente código:
connect () .use (connect.query ()) // nos da req.query .use (connect.bodyParser ()) // nos da req.body .use (connect.cookieParser ()) // para la sesión .use (connect.session (secret: "asdf")) // nos da req.session .use (function (req, res) res.write ("req.url:" + req.url + "\ n \ n "); res.write (" req.method: "+ req.method +" \ n \ n "); res.write (" req.headers: "+ JSON.stringify (req.headers) +" \ n \ n "); res.write (" req.query: "+ JSON.stringify (req.query) +" \ n \ n "); res.write (" req.body: "+ JSON.stringify (req. cuerpo) + "\ n \ n"); res.write ("req.cookies:" + JSON.stringify (req.cookies) + "\ n \ n"); res.write ("req.session:" + JSON.stringify (req.session)); res.end ();). Listen (3000);
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:
curl -X POST -d "name = YourName" "http: // localhost: 3000 / some / url? some = data"
Con esas siete propiedades, puede administrar casi cualquier solicitud que reciba. No creo que los remolques se utilicen a menudo (nunca los he visto en mi experiencia), pero puedes usar req.trailers
si los espera en sus solicitudes (los remolques son como encabezados, pero después del cuerpo).
Entonces, ¿qué hay de tu respuesta??
El objeto de respuesta sin formato no proporciona los lujos que le brindan las bibliotecas (como Express). Por ejemplo, no puede responder con una simple llamada de render a una plantilla prefabricada, al menos, no de forma predeterminada. Se supone 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 a la vez utilizando writeHead ()
método. Aquí hay un ejemplo de la documentación de Node:
var body = 'hola mundo'; response.writeHead (200, 'Content-Length': body.length, 'Content-Type': 'text / plain');
Si necesita configurar encabezados individualmente, puede usar el setHeader ()
método:
connect () .use (function (req, res) var accept = req.headers.accept.split (","), body, type; console.log (accept); if (accept.indexOf ("application / json ")> -1) type =" application / json "; body = JSON.stringify (message:" hello "); else if (accept.indexOf (" text / html ")> -1) type = "texto / html"; cuerpo = "Hola!
"; else type =" text / plain "; body =" hello! "; res.statusCode = 200; res.setHeader (" Content-Type ", type); res.end (body);). escuchar (3000);
Agregue este código a un archivo, inicie el servidor y solicítelo desde el navegador. Tienes HTML! Ahora ejecuta:
curl http: // localhost: 3000
Y recibirás texto plano. Para JSON, prueba esto:
curl -H "aceptar: aplicación / json" http: // localhost: 3000
Todo desde la misma URL!
Utilizar res.getHeader (nombre)
Si necesita saber qué encabezados ya se han establecido. También puedes usar res.removeHeader (nombre)
quitar un encabezado.
Por supuesto, una respuesta es inútil sin un cuerpo. Como ha visto a lo largo de este tutorial, puede escribir fragmentos de datos en el cuerpo con la res.write ()
método. Esto acepta una cadena o un objeto de búfer como un argumento. Si es una cadena, el segundo parámetro es el tipo de codificación (por defecto es utf8
).
los res.end ()
El método cierra el cuerpo, pero puede pasarle datos para escribir en el flujo de respuesta. Esto es útil en situaciones en las que solo necesita dar salida a una sola línea.
Es algo difícil responder con cuerpos HTML más grandes en Node y Connect antiguos. Este es un buen lugar para lanzar middleware de terceros en la mezcla. Puede encontrar una lista de middleware de terceros en la wiki de Connect Github. Como ejemplo, vamos a utilizar el paquete connect-jade, que nos permite renderizar vistas de jade..
Primero, instale conecte-jade
:
npm instala connect-jade
A continuación, solicítelo y agréguelo como middleware. Querrá establecer algunos valores predeterminados:
var connect = require ("connect"), connectJade = require ("connect-jade"); connect () .use (connectJade (root: __dirname + "/ views", valores predeterminados: title: "MyApp")) .use (function (req, res) res.render ("index", header : "Bienvenido a mi aplicación");). Listen (3000);
Establezca la raíz como el directorio que contiene los archivos de vista. También puede configurar por defecto
; estas son variables que están disponibles dentro de cada vista, a menos que las anulemos más tarde al llamar hacer()
.
La función final en este código hace una llamada a res.render ()
. Este método es proporcionado por el conecte-jade
paquete.
El primer argumento que acepta es el nombre de la vista para renderizar..
Es el camino a la vista., sans El camino que definimos al agregar el middleware., sans la extensión de archivo de jade. Para este código, necesitamos un vistas / index.jade
plantilla para renderizar. Lo mantendremos simple:
Título de la cabecera html = Cuerpo del título h1 = Encabezado
Si no está familiarizado con el 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 la por defecto
configuramos, más el segundo objeto de parámetro (opcional) pasado a res.render ()
.
Hay muchos otros middlewares de terceros, pero funcionan de manera similar. Los instalas vía npm, los requieres y los pones en acción..
Si investiga cómo funciona Connect, descubrirá que cada capa es en realidad un módulo Node, un diseño muy inteligente. Si usa Connect para aplicaciones de gran tamaño, sería ideal escribir su código en formato de módulo Node. Usted podría tener una app.js
archivo como este:
// app.js module.exports = function (req, res, next) res.end ("proviene de un módulo"); ;
Y en tu server.js
:
var connect = require ("connect"), app = require ("./ app"); connect () .use (app) .listen (3000);
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 sobre la API de Node sin formato que le brinda un control completo sobre su aplicación de servidor. Si quieres un poco más, recomiendo Express (por la misma gente, por cierto). De lo contrario, Connect es una biblioteca fantástica y extensible para aplicaciones web Node..