¿Cómo instalar Node.js con npm?

Construyendo tu Servidor Web con Node.js y Express

27/12/2023

Valoración: 4.26 (8159 votos)

En el fascinante mundo del desarrollo web, contar con las herramientas adecuadas es fundamental para construir aplicaciones robustas y eficientes. Node.js se ha consolidado como un entorno de ejecución de JavaScript muy popular, permitiendo a los desarrolladores utilizar un único lenguaje tanto en el frontend como en el backend. Complementando a Node.js, encontramos npm, el gestor de paquetes por excelencia que simplifica la inclusión de librerías y frameworks en nuestros proyectos. Pero, ¿cómo dar el primer paso y configurar un servidor web funcional con estas herramientas? Acompáñanos en esta guía detallada donde exploraremos desde la instalación básica hasta la configuración de un servidor seguro utilizando el popular framework Express.js, tanto para el protocolo HTTP como para el crucial HTTPS.

¿Cómo instalar Node.js con npm?
El primer paso es que debemos tener instalado Node.js con NPM, este último se instala al mismo tiempo de instalar Node.js dado que npm es el Node Package Manager. Podemos descargar esta aplicación desde el sitio oficial dando click aquí
Índice de Contenido

Fundamentos: Node.js y NPM – La Base de tu Servidor Web

Antes de sumergirnos en la creación de un servidor, es imprescindible tener Node.js instalado en tu sistema. La buena noticia es que npm, que significa Node Package Manager, se instala automáticamente junto con Node.js. Esto significa que al descargar e instalar Node.js, ya tendrás a tu disposición la herramienta fundamental para gestionar todas las dependencias de tus proyectos.

Para obtener Node.js, el proceso es sencillo. Debes dirigirte al sitio web oficial de Node.js, donde encontrarás las versiones recomendadas para tu sistema operativo. Una vez descargado el instalador, sigue los pasos habituales. Es un proceso intuitivo que te guiará hasta completar la instalación. Una vez finalizado, puedes verificar que todo se instaló correctamente abriendo una terminal o línea de comandos y ejecutando:

node -v npm -v

Estos comandos deberían mostrar las versiones instaladas de Node.js y npm, confirmando que estás listo para continuar con los siguientes pasos.

Iniciando tu Proyecto: `npm init` al Rescate

Con Node.js y npm listos, el siguiente paso es preparar el entorno para tu nuevo proyecto de servidor web. Te recomendamos crear una carpeta específica para tu proyecto. Por ejemplo, podrías llamarla servidor-web o mi-proyecto-backend. Una vez creada, navega hasta ella utilizando tu terminal o línea de comandos. Por ejemplo, si tu carpeta se llama servidor y está en tu directorio de usuario, podrías usar:

cd servidor

Dentro de esta carpeta, ejecutarás el comando fundamental para inicializar tu proyecto:

npm init

Este comando es interactivo y te hará una serie de preguntas para configurar tu proyecto. Si no ingresas un valor y simplemente presionas Enter, se aceptará el valor por defecto que se muestra entre paréntesis. Aquí te presentamos las preguntas más comunes y su significado:

  • package name: (servidor): El nombre de tu paquete. Suele ser el nombre de la carpeta del proyecto.
  • version: (1.0.0): La versión inicial de tu proyecto.
  • description:: Una breve descripción de tu proyecto. Esto es útil para documentar lo que hace tu aplicación. Por ejemplo: servidor https con node y express.
  • entry point: (index.js): El archivo principal de tu aplicación, el que se ejecutará al iniciar el servidor. Por defecto, index.js es una excelente elección.
  • test command:: Un comando para ejecutar pruebas, si las tienes configuradas.
  • git repository:: Si tu proyecto está en un repositorio Git, puedes enlazarlo aquí.
  • keywords:: Palabras clave que describen tu proyecto, útiles para búsquedas.
  • author:: Tu nombre o el nombre del autor del proyecto.
  • license: (ISC): La licencia bajo la cual se distribuye tu código.

Después de responder a todas las preguntas, npm te mostrará un resumen del archivo package.json que se va a crear y te pedirá confirmación (Is this OK? (yes)). Simplemente escribe yes y presiona Enter.

El archivo package.json es el corazón de tu proyecto Node.js. Es un archivo JSON que contiene metadatos sobre tu proyecto, como su nombre, versión, descripción, el punto de entrada principal y, lo más importante, una lista de todas las dependencias de las que tu proyecto depende. Inicialmente, su contenido será similar a este:

{ "name": "servidor", "version": "1.0.0", "description": "servidor https con node y express", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Jacob", "license": "ISC" }

Este archivo es crucial porque permite a otros desarrolladores (o a ti mismo en el futuro) instalar fácilmente todas las dependencias necesarias del proyecto con un simple comando npm install.

Potenciando tu Servidor: Instalando Express.js

Aunque Node.js es potente por sí mismo, construir un servidor web desde cero puede ser tedioso. Aquí es donde entra en juego Express.js, un framework web minimalista y flexible para Node.js que proporciona un conjunto robusto de características para desarrollar aplicaciones web y APIs. Simplifica enormemente el manejo de rutas, middleware y peticiones HTTP.

Para instalar Express.js en tu proyecto, asegúrate de estar en la carpeta raíz de tu proyecto en la terminal y ejecuta el siguiente comando:

npm install --save express

El argumento --save (que es el comportamiento por defecto en versiones recientes de npm) es importante porque le dice a npm que no solo instale el paquete, sino que también lo añada a la sección de dependencies en tu archivo package.json. Esto asegura que cualquier persona que clone tu repositorio pueda instalar todas las dependencias con un simple npm install.

Una vez que la instalación finalice, notarás dos cambios importantes en la carpeta de tu proyecto:

  1. Se creará una nueva carpeta llamada node_modules. Esta carpeta contiene todos los módulos y paquetes que Express.js necesita para funcionar, así como las dependencias de Express.js y cualquier otro paquete que instales. Generalmente, esta carpeta no se sube a los sistemas de control de versiones como Git.
  2. Tu archivo package.json se actualizará. Ahora incluirá una nueva sección llamada dependencies, listando a Express.js y su versión instalada:
{ "name": "servidor", "version": "1.0.0", "description": "servidor https con node y express", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Jacob", "license": "ISC", "dependencies": { "express": "^4.17.1" } }

Esta es la confirmación de que Express.js se ha integrado exitosamente en tu proyecto.

Preparando el Terreno para HTTPS: Módulos `fs` y `https`

Aunque ya podemos crear un servidor HTTP con Express, nuestro objetivo final es construir un servidor seguro utilizando el protocolo HTTPS. Para ello, necesitaremos dos módulos adicionales de Node.js: fs (File System) y https. El módulo fs nos permitirá leer archivos del sistema, lo cual será crucial para cargar los certificados SSL que requiere HTTPS. El módulo https, por su parte, nos proporcionará la funcionalidad para crear el servidor seguro.

Instalamos estos módulos de la misma manera que instalamos Express, utilizando npm:

npm install --save fs npm install --save https

Aunque fs es un módulo nativo de Node.js y no siempre requiere instalación explícita como dependencia de usuario (ya está disponible globalmente), instalarlo con --save asegura que se registre en package.json si se utiliza en una forma que lo requiera para la compatibilidad con ciertas versiones o entornos. El módulo https, sin embargo, sí es una dependencia externa que debe instalarse.

Después de estas instalaciones, tu archivo package.json se verá así, con las nuevas dependencias listadas:

{ "name": "servidor", "version": "1.0.0", "description": "servidor https con node y express", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Jacob", "license": "ISC", "dependencies": { "express": "^4.17.1", "fs": "0.0.1-security", "https": "^1.0.0" } }

Con todas las dependencias necesarias en su lugar, estamos listos para escribir el código de nuestro servidor.

Construyendo tu Primer Servidor HTTP Básico

Para empezar, vamos a crear un servidor web básico que sirva contenido a través del protocolo HTTP. Este paso es fundamental para entender cómo Express maneja las peticiones y respuestas. Crea un archivo llamado index.js (o el nombre que hayas definido como entry point en package.json) en la raíz de tu proyecto y añade el siguiente código:

var express = require('express'); var app = express(); const PUERTO = 80; app.listen(PUERTO, function(){ console.log('Servidor http corriendo en el puerto ' + PUERTO); }); app.get('/', function(req, res){ res.send('Hola, estas en la pagina inicial'); console.log('Se recibio una petición get'); });

Analicemos este código:

  • var express = require('express');: Importa el módulo Express.js en nuestro archivo.
  • var app = express();: Crea una instancia de la aplicación Express.
  • const PUERTO = 80;: Define el puerto en el que nuestro servidor escuchará las peticiones. El puerto 80 es el puerto estándar para HTTP. Si ya tienes otra aplicación (como Apache o IIS) corriendo en el puerto 80, puedes cambiar este valor a un puerto disponible, por ejemplo, 4000 o 3000.
  • app.listen(PUERTO, function(){...});: Inicia el servidor y lo pone a escuchar en el puerto especificado. La función de callback se ejecuta una vez que el servidor ha comenzado a escuchar.
  • app.get('/', function(req, res){...});: Define una ruta para las peticiones GET a la raíz (/) de tu servidor. Cuando un usuario accede a http://localhost/, esta función se ejecuta. req representa la petición recibida y res la respuesta que enviaremos.
  • res.send('Hola, estas en la pagina inicial');: Envía una respuesta de texto simple al navegador del cliente.
  • console.log('Se recibio una petición get');: Imprime un mensaje en la consola del servidor cada vez que se recibe una petición GET a la raíz, útil para depuración.

Para ejecutar este servidor, abre tu terminal en la carpeta del proyecto y ejecuta:

node index.js

La consola debería mostrar el mensaje Servidor http corriendo en el puerto 80 (o el puerto que hayas elegido). Ahora, abre tu navegador web y navega a http://localhost (o http://localhost:PUERTO si usaste un puerto diferente). Deberías ver el mensaje Hola, estas en la pagina inicial en tu navegador, y en la terminal, el mensaje Se recibio una petición get.

Para detener el servidor, simplemente presiona Ctrl + C en la terminal.

El Salto a la Seguridad: Implementando HTTPS

La seguridad en la web es primordial, y el protocolo HTTPS es la base de esa seguridad, cifrando la comunicación entre el navegador del usuario y tu servidor. Para crear un servidor HTTPS, necesitamos un par de archivos especiales: los certificados SSL/TLS. Estos suelen ser un archivo de certificado (.crt o .pem) y un archivo de clave privada (.key).

Para entornos de desarrollo y pruebas, puedes generar certificados autofirmados. Para entornos de producción, deberías obtener certificados de una autoridad de certificación reconocida (CA) para asegurar la confianza de los navegadores. Asumiendo que ya tienes tus archivos de certificado (por ejemplo, mi_certificado.crt y mi_certificado.key), cópialos en la carpeta raíz de tu proyecto.

Ahora, modificaremos nuestro archivo index.js para que el servidor utilice HTTPS. Aquí está el código actualizado:

var express = require('express'); var fs = require('fs'); var https = require('https'); var app = express(); const PUERTO = 443; https.createServer({ cert: fs.readFileSync('mi_certificado.crt'), key: fs.readFileSync('mi_certificado.key') }, app).listen(PUERTO, function(){ console.log('Servidor https corriendo en el puerto ' + PUERTO); }); app.get('/', function(req, res){ res.send('Hola, estas en la pagina inicial'); console.log('Se recibio una petición get a través de https'); });

Los cambios clave son:

  • Importamos los módulos fs y https.
  • Cambiamos el PUERTO a 443, el puerto estándar para HTTPS. Al igual que con HTTP, puedes usar otro puerto si el 443 ya está en uso.
  • En lugar de app.listen(), utilizamos https.createServer(). Esta función toma dos argumentos principales: un objeto de opciones que contiene los certificados y la aplicación Express (app).
  • Dentro del objeto de opciones, cert y key son las propiedades que apuntan a tus archivos de certificado y clave privada, respectivamente. Utilizamos fs.readFileSync() para leer sincrónicamente el contenido de estos archivos.

Para ejecutar este servidor HTTPS, detén cualquier instancia anterior (Ctrl + C) y luego ejecuta nuevamente:

node index.js

En tu navegador, ahora debes acceder usando https://localhost (o https://localhost:PUERTO si usaste un puerto diferente). Es muy probable que tu navegador te muestre una advertencia de seguridad (por ejemplo, "Tu conexión no es privada" o "Riesgo potencial de seguridad"). Esto es completamente normal y esperado cuando se utilizan certificados autofirmados o certificados que no están asociados con el dominio real en producción. El navegador te está advirtiendo que no puede verificar la identidad del servidor a través de una autoridad de certificación reconocida. Sin embargo, la comunicación entre tu navegador y el servidor sigue estando cifrada.

Este ejemplo te proporciona una base sólida para entender cómo configurar un servidor web con seguridad HTTPS utilizando Node.js y Express. A partir de aquí, puedes expandir tu servidor para manejar diversas rutas, bases de datos y funcionalidades más complejas.

Tabla Comparativa: HTTP vs. HTTPS en Desarrollo con Node.js

Comprender las diferencias entre HTTP y HTTPS es crucial para el desarrollo web moderno. Aquí una tabla comparativa de sus características principales en el contexto de un servidor Node.js:

CaracterísticaServidor HTTP (Ejemplo con Node.js)Servidor HTTPS (Ejemplo con Node.js)
Propósito PrincipalComunicación web básica sin cifrado. Ideal para desarrollo inicial y pruebas internas.Comunicación web segura y cifrada. Indispensable para producción y manejo de datos sensibles.
Puerto Estándar80443
Requisitos de Certificado SSL/TLSNo requiere certificados.Requiere certificados (.crt o .pem) y clave privada (.key). Pueden ser autofirmados para desarrollo.
Módulos de Node.js UtilizadosPrincipalmente express.express, https, y fs para leer los certificados.
Complejidad de ConfiguraciónMás sencilla, solo requiere iniciar la aplicación Express en un puerto.Ligeramente más compleja, requiere la gestión de certificados y el uso del módulo https.createServer.
Confianza del NavegadorNo hay advertencias de seguridad relacionadas con el cifrado, pero el sitio se marca como "No seguro".Con certificados de CA, el navegador muestra un candado verde. Con autofirmados, muestra advertencias de seguridad.

Preguntas Frecuentes (FAQ)

¿Qué es `package.json` y por qué es tan importante?

El archivo package.json es el manifiesto de un proyecto Node.js. Contiene metadatos como el nombre, versión, descripción, punto de entrada principal y, crucialmente, una lista de todas las dependencias del proyecto. Es vital porque permite a otros desarrolladores (o a ti mismo) configurar el proyecto rápidamente instalando todas las librerías necesarias con un simple npm install. Sin este archivo, sería muy difícil saber qué dependencias requiere tu proyecto y en qué versiones.

¿Por qué mi navegador me advierte sobre un sitio no seguro cuando uso HTTPS con un certificado autofirmado?

Tu navegador te advierte porque el certificado SSL/TLS utilizado para cifrar la conexión no ha sido emitido por una Autoridad de Certificación (CA) reconocida y de confianza. Los certificados autofirmados son generados por ti mismo y no pueden ser verificados por el navegador a través de una cadena de confianza establecida. Aunque la conexión está cifrada, el navegador no puede garantizar que te estás conectando al servidor legítimo que esperas, de ahí la advertencia. Para producción, siempre debes usar certificados emitidos por una CA.

¿Puedo usar un puerto diferente al 80 para HTTP o 443 para HTTPS?

¡Sí, absolutamente! Los puertos 80 y 443 son los puertos estándar y por defecto para HTTP y HTTPS, respectivamente. Esto significa que si un usuario no especifica un puerto en la URL (por ejemplo, http://example.com), el navegador asumirá el puerto 80 o 443. Sin embargo, para desarrollo o en entornos donde esos puertos están ocupados o requieren permisos especiales, puedes usar cualquier puerto disponible (por ejemplo, 3000, 4000, 8080). Si usas un puerto no estándar, los usuarios deberán especificarlo en la URL (por ejemplo, http://localhost:3000).

¿Cuál es la diferencia entre los módulos `http` y `https` en Node.js?

Los módulos http y https son módulos nativos de Node.js que proporcionan la funcionalidad para crear servidores y clientes HTTP y HTTPS, respectivamente. La principal diferencia radica en la seguridad: el módulo http maneja conexiones de texto plano, mientras que el módulo https maneja conexiones cifradas TLS/SSL. Para usar https, es necesario proporcionar los certificados SSL/TLS, lo que lo hace más adecuado para comunicaciones sensibles y seguras.

¿Es necesario instalar `fs` con `npm install --save fs`?

El módulo fs (File System) es un módulo nativo de Node.js, lo que significa que viene incluido con la instalación de Node.js y no necesita ser instalado a través de npm para ser utilizado. Puedes simplemente usar require('fs') en tu código. La inclusión de npm install --save fs en algunos ejemplos podría ser un remanente de prácticas antiguas o para asegurar que se registre como una dependencia explícita si el proyecto tiene configuraciones muy específicas, pero no es estrictamente necesario para su funcionamiento básico.

Conclusión

Hemos recorrido un camino completo, desde la instalación de Node.js y npm hasta la creación de servidores web funcionales con Express.js, abarcando tanto el protocolo HTTP como el fundamental HTTPS. Entender estos pasos iniciales es la piedra angular para cualquier desarrollador que desee construir aplicaciones web robustas y seguras. Has aprendido a inicializar proyectos, gestionar dependencias con npm install, y a configurar Express para responder a peticiones, incluyendo la crucial implementación de seguridad mediante certificados SSL. Este conocimiento no solo te permite poner en marcha tus propios proyectos backend, sino que también te capacita para comprender la infraestructura subyacente de muchas de las aplicaciones web que usamos a diario. ¡El mundo del desarrollo web con Node.js está ahora a tu alcance, listo para que sigas explorando y construyendo!

Si quieres conocer otros artículos parecidos a Construyendo tu Servidor Web con Node.js y Express puedes visitar la categoría Librerías.

Subir