🌐 ¿Node.js incluye un servidor web?

Sí. Node.js incluye un módulo nativo llamado http que permite crear servidores web sin necesidad de instalar nada adicional.

🔧 Es un servidor HTTP de bajo nivel, que te da control absoluto sobre el manejo de peticiones y respuestas.

⚙️ ¿Qué tipo de servidor es?

  • Asíncrono y basado en eventos
  • No bloqueante (non-blocking I/O)
  • Monohilo (single-threaded) con un event loop

Esto significa que puede manejar muchas conexiones simultáneamente con eficiencia, sin crear un nuevo hilo por cada conexión (como sí hacen Apache o Java con threads).

🛠️ ¿Qué permite hacer?

Con el módulo http podés:

  • Crear servidores HTTP o HTTPS personalizados
  • Leer y manejar headers, métodos, rutas, etc.
  • Servir HTML, JSON, archivos o respuestas dinámicas
  • Integrar con frameworks (como Express.js) que simplifican el desarrollo

🔍 Ejemplo básico:

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('¡Hola desde Node.js!\n');
});

server.listen(3000, () => {
  console.log('Servidor corriendo en http://localhost:3000');
});

✅ Ventajas

Ventaja Descripción
🔁 Asincronía y no bloqueo Maneja miles de conexiones concurrentes
🧩 Minimalista y flexible Podés construir desde cero o usar frameworks
🚀 Rápido para I/O Ideal para APIs, websockets, chat, streaming
🎯 Integración directa con JS Usás un solo lenguaje en todo el stack
🛠️ Full control Puedes personalizar el manejo de peticiones

⚠️ Limitaciones

Limitación Descripción
🧵 Monohilo Si una operación bloquea el hilo (ej: CPU intensiva), bloquea todo
🧱 No es plug-and-play No tiene soporte nativo para cosas como .htaccess, redirecciones automáticas, etc.
🔒 Requiere implementar seguridad No tiene por defecto SSL, rate limiting, CORS, etc. Hay que añadirlos manualmente o con módulos
📁 No sirve archivos estáticos fácilmente Hay que programar lógica para servir archivos como .jpg, .css, etc., o usar Express/middleware

💡 Cuándo usarlo directamente

  • Para APIs REST
  • Para websockets o servicios en tiempo real
  • Para sistemas donde necesitás control total del flujo HTTP
  • Para entornos de microservicios

👎 Cuándo no usarlo directamente

  • Si necesitás configuración rápida y soporte de archivos estáticos como en Apache o Nginx
  • Para apps web complejas sin usar un framework (Express.js es mucho más práctico)
  • Para tareas CPU intensivas (como compresión de video, cifrado fuerte, etc.)