Guía para principiantes sobre desarrollo de servidores web con Node.js

Durante la mayor parte de mi carrera en la web, trabajé exclusivamente en el lado del cliente. Diseño de diseños adaptativos, creación de visualizaciones a partir de grandes cantidades de datos, creación de paneles de aplicaciones, etc. Pero nunca tuve que lidiar con el enrutamiento o las solicitudes HTTP directamente. Hasta hace poco

Esta publicación es una descripción de cómo aprendí más sobre el desarrollo web del lado del servidor usando Node.js, y una breve comparación de cómo escribir un servidor HTTP simple usando 3 entornos diferentes, Express, Koa.js y Hapi.js.

Nota: si eres un desarrollador experimentado de Node.js, probablemente pienses que todo esto es elemental / simple. ¯ \ _ (ツ) _ / ¯.

Algunos conceptos básicos de la red.


Cuando comencé a trabajar en la industria web hace un par de años, me encontré con un curso sobre redes informáticas del profesor David Veteral en Coursera. Desafortunadamente, ya no está disponible, pero las conferencias aún están disponibles en el sitio web de Pearson .

Realmente me gustó este curso porque explicaba lo que estaba sucediendo bajo el capó de una manera comprensible, por lo que si puede leer el libro de texto de Redes de computadoras , lea todos los detalles sobre las maravillas de la red.

imagen

Aquí, sin embargo, voy a hablar brevemente sobre el contexto. HTTP (Protocolo de transferencia de hipertexto) es un protocolo de comunicación utilizado en redes informáticas. Hay muchos en Internet, como SMTP (Protocolo simple de transferencia de correo) , FTP (Protocolo de transferencia de archivos) , POP3 (Protocolo de oficina de correos 3), etc.

Estos protocolos permiten que dispositivos con hardware / software completamente diferente se comuniquen entre sí, ya que proporcionan formatos de mensajes, reglas, sintaxis y semántica bien definidos, etc. Esto significa que si bien el dispositivo admite un protocolo específico, puede comunicarse con cualquier otro dispositivo. en la red

imagen
De TCP / IP vs OSI: ¿cuál es la diferencia entre los dos modelos?

Los sistemas operativos generalmente vienen con soporte para protocolos de red, como HTTP, listos para usar, lo que explica por qué no necesitamos instalar explícitamente ningún software adicional para acceder a Internet. La mayoría de los protocolos de red admiten una conexión abierta entre dos dispositivos, lo que les permite transferir datos de un lado a otro.

El HTTP en el que se ejecuta la red es diferente. Se conoce como protocolo sin conexión porque se basa en un modo de operación de solicitud / respuesta. Los navegadores web envían solicitudes al servidor de imágenes, fuentes, contenido, etc., pero una vez completada la solicitud, la conexión entre el navegador y el servidor se desconecta.

imagen

Servidores y Clientes


El término servidor puede ser un poco confuso para las personas que son nuevas en la industria por primera vez, ya que puede referirse tanto al hardware (computadoras físicas que alojan todos los archivos y software requeridos por los sitios web) como al software (un programa que permite a los usuarios acceder a estos archivos en línea).

Hoy hablaremos sobre el lado del software de las cosas. Pero primero, algunas definiciones. La URL significa Universal Resource Locator y consta de 3 partes: protocolo , servidor y el archivo solicitado .

imagen
Estructura de URL

El protocolo HTTP define varios métodos que el navegador puede usar para pedirle al servidor que realice un montón de acciones diferentes, las más comunes son GET y POST. Cuando un usuario hace clic en un enlace o ingresa una URL en la barra de direcciones, el navegador envía una solicitud GET al servidor para recuperar el recurso especificado en la URL.

El servidor debe saber cómo procesar esta solicitud HTTP para obtener el archivo correcto y luego enviarlo de vuelta al navegador que lo solicitó. El software de servidor web más popular que maneja esto es Apache y NGINX .

imagen
Los servidores web procesan las solicitudes entrantes y responden en consecuencia

Ambos son paquetes de software de código abierto con todas las funciones que incluyen características tales como esquemas de autenticación, reescritura de URL, registro y representación, por nombrar solo algunos. Apache y NGINX están escritos en C. Técnicamente, puede escribir un servidor web en cualquier idioma. Python , golang.org/pkg/net/http , Ruby , esta lista puede continuar por bastante tiempo. Es solo que algunos idiomas hacen ciertas cosas mejor que otros.

Crear un servidor HTTP con Node.js


Node.js es un tiempo de ejecución de Javascript creado en el motor Javascript de Chrome V8 . Viene con el módulo http , que proporciona un conjunto de funciones y clases para construir un servidor HTTP.

Para este servidor HTTP básico, también utilizaremos el sistema de archivos , la ruta y la URL , que son módulos nativos de Node.js.

Comience importando los módulos necesarios.

const http = require('http') //   HTTP-  Node.js const fs = require('fs') //      const path = require('path') //        const url = require('url') //     URL 

También crearemos un diccionario de tipo MIME para que podamos asignar el tipo MIME apropiado al recurso solicitado en función de su extensión. Puede encontrar una lista completa de los tipos MIME en la Autoridad de Números Asignados de Internet .

 const mimeTypes = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.ico': 'image/x-icon', '.png': 'image/png', '.jpg': 'image/jpeg', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.json': 'application/json', '.woff': 'font/woff', '.woff2': 'font/woff2' } 

Ahora podemos crear un servidor HTTP con la función http.createServer() , que devolverá una nueva instancia de http.Server .

 const server = http.createServer() 

Pasaremos la función de controlador de solicitudes a createServer() con los objetos de solicitud y respuesta. Esta función se llama una vez cada vez que llega una solicitud HTTP al servidor.

 server.on('request', (req, res) => { //     }) 

El servidor se inicia llamando al método de listen del objeto del server con el número de puerto en el que queremos que escuche el servidor, por ejemplo, 5000 .

 server.listen(5000) 

El objeto de request es una instancia de IncomingMessage y nos permite acceder a toda la información sobre la solicitud, como el estado de respuesta, los encabezados y los datos.

El objeto de response es una instancia de ServerResponse , que es una secuencia de escritura y proporciona muchos métodos para enviar datos al cliente.

En el manejador de consultas, queremos hacer lo siguiente:

  • Analizar solicitud entrante y procesarla sin extensiones

     const parsedUrl = new URL(req.url, 'https://node-http.glitch.me/') let pathName = parsedUrl.pathname let ext = path.extname(pathName) //   URL    '/',   '/' //      URL    'Location' if (pathName !== '/' && pathName[pathName.length - 1] === '/') { res.writeHead(302, {'Location': pathName.slice(0, -1)}) res.end() return } //     ,  index.html //     «.html»       if (pathName === '/') { ext = '.html' pathName = '/index.html' } else if (!ext) { ext = '.html' pathName += ext } 

  • Realice algunas comprobaciones elementales para determinar si el recurso solicitado existe y responda en consecuencia

     //     ,       const filePath = path.join(process.cwd(), '/public', pathName) // ,       fs.exists(filePath, function (exists, err) { //     ,  404 Not Found if (!exists || !mimeTypes[ext]) { console.log('  : ' + pathName) res.writeHead(404, {'Content-Type': 'text/plain'}) res.write('404 Not Found') res.end() return } //        200 OK, //       res.writeHead(200, {'Content-Type': mimeTypes[ext]}) //        const fileStream = fs.createReadStream(filePath) fileStream.pipe(res) }) 


Todo el código está alojado en Glitch, y puede remezclar el proyecto si lo desea.

https://glitch.com/edit/#!/node-http

Crear un servidor HTTP con marcos Node.js


Los frameworks Node.js como Express , Koa.js y Hapi.js vienen con varias características útiles de middleware, además de muchas otras funciones prácticas que evitan que los desarrolladores tengan que escribir por sí mismos.

Personalmente, creo que es mejor aprender primero los conceptos básicos sin marcos, solo para entender lo que sucede debajo del capó y luego volverse loco con cualquier marco que te guste.

Express tiene su propio complemento incorporado para servir archivos estáticos, por lo que el código requerido para realizar las mismas acciones que en su propio Node.js es mucho más corto.

 const express = require('express') const app = express() //         app.use(express.static('public')) //  index.html,      //     res.sendFile() app.get('/', (req, res) => { res.sendFile(__dirname + '/public/index.html') }) app.listen(5000) 

Koa.js no tiene un complemento similar dentro de su núcleo, por lo que cualquier complemento requerido debe instalarse por separado. La última versión de Koa.js utiliza funciones asincrónicas a favor de las devoluciones de llamada. Puede usar el complemento koa-static para servir archivos estáticos.

 const serve = require('koa-static') const koa = require('koa') const app = new koa() //         //   koa-static    index.html    app.use(serve(__dirname + '/public')) app.listen(5000) 

Hapi.js admite la personalización y gira en torno a la personalización del objeto del server . Utiliza complementos para ampliar funciones como enrutamiento, autenticación, etc. Para servir archivos estáticos, necesitamos un complemento llamado inert .

 const path = require('path') const hapi = require('hapi') const inert = require('inert') //        const server = new hapi.Server({ port: 5000, routes: { files: { relativeTo: path.join(__dirname, 'public') } } }) const init = async () => { // server.register()      await server.register(inert) // inert     //       server.route({ method: 'GET', path: '/{param*}', handler: { directory: { path: '.', redirectToSlash: true, index: true } } }) await server.start() } init() 

Cada una de estas plataformas tiene sus pros y sus contras, y serán más obvias para aplicaciones más grandes, y no solo para servir una sola página HTML. La elección de la estructura dependerá en gran medida de los requisitos reales del proyecto en el que esté trabajando.

Finalización


Si el lado de la red de las cosas siempre ha sido una caja negra para usted, espero que este artículo le sirva como una introducción útil al protocolo que proporciona la red. También recomiendo leer la documentación de la API de Node.js , que está muy bien escrita y es muy útil para cualquier novato en Node.js en general.

Source: https://habr.com/ru/post/es435970/


All Articles