¿Cómo crear un servidor web en 5 minutos con Node.js?

Primero, ¿Qué es node.js?, tomando la definición del sitio oficial, Node.js® es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, npm, es el ecosistema más grande de librerías de código abierto en el mundo.

Vamos a describir la parte que nos interesa, Node.js es un programa, V8 es un motor de javascript de código abierto creado por Google, por lo que también lo hace un programa, V8 está escrito en C++, y la tarea de V8 es tomar código Javascript y convertirlo a código maquina (compilar código), pero lo que lo hace especial para nuestros fines es que puede ser embebido dentro de otros programas, lo que permite que V8 este embebido en Node.js, V8 por así decirlo es el punto de partida para toda la funcionalidad de Node.js.

Node.js también está escrito en C++ y utiliza la API de V8 para agregarle características y funcionalidades nuevas a Javascript. Estas nuevas funcionalidades permiten tener acceso al sistema de archivos y carpetas, nos permite crear un servidor http y TCP, además de acceso a POSIX, o sea, a toda la funcionalidad del sistema operativo donde se encuentre instalado.

Node.js proporciona la sintaxis Javascript para crear programas que tengan acceso a las características del sistema operativo donde sé está ejecutando.

Con esto podemos razonar que con Node.js podemos crear un servidor web, para crearlo, vamos a utilizar NPM (Node Package Manager) y express.js un frawework web.

Vamos a crear una nueva carpeta llamada mi-servidor-web, luego accede a esta carpeta con:

$ cd mi-servidor-web

Ahora vamos a iniciar el proyecto utilizando el siguiente comando:

$ npm init

La línea de comandos nos pedirá algunos datos, puedes dar “enter” a todos si quieres, te muestro un ejemplo:

Press ^C at any time to quit.
package name: (mi-servidor-web) 
version: (1.0.0) 
description: Mi primer servidor web
entry point: (index.js)
test command: 
git repository: 
keywords: 
author: Jaime Cervantes<jaime.cervantes.ve@gmail.com>
license: (ISC) 
About to write to /home/jaime/develop/node.js/mi-servidor-web/package.json:

{
  "name": "mi-servidor-web",
  "version": "1.0.0",
  "description": "Mi primer servidor web",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Jaime Cervantes <jaime.cervantes.ve@gmail.com>",
  "license": "ISC"
}


Is this ok? (yes) 

npm init nos genera un archivo package.json:

{
  "name": "mi-servidor-web",
  "version": "1.0.0",
  "description": "Mi primer servidor web",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Jaime Cervantes <jaime.cervantes.ve@gmail.com>",
  "license": "ISC"
}

Este archivo contiene la información anteriormente proporcionada y además se encarga de controlar los paquetes que instalamos para nuestro proyecto. Por ejemplo, para poder crear nuestro servidor rápidamente, vamos a instalar un paquete llamado express.js de la siguiente manera:

$ npm install express --save

Este comando instala express.js y además actualiza nuestro archivo package.json gracias al parámetro --save en la propiedad dependencies:

{
  "name": "mi-servidor-web",
  "version": "1.0.0",
  "description": "Mi primer servidor web",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Jaime Cervantes <jaime.cervantes.ve@gmail.com>",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.2"
  }
}

Ya teniendo express instalado, vamos a crear nuestro servidor web creando el archivo  ./mi-servidor-web/index.js:

const express = require('express');
const app = express();

app.use(express.static(__dirname + '/public/'));

app.listen('3000', function() {
  console.log('Servidor web escuchando en el puerto 3000');
});

Hay una parte importante que nos permitirá ver el funcionamiento de nuestro servidor web:

app.use(express.static(__dirname + '/public/'));

Esta línea le indica a nuestro servidor que cuando un usuario haga una petición de archivos estáticos, por ejemplo, http://localhost:300/index.html enviará como respuesta el contenido de ./public/index.html.

Vamos a crear la carpeta public y el archivo index.html con el editor de nuestro preferencia o en línea de comandos si lo deseas. Agregamos el siguiente contenido a nuestro archivo index.html:

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Mi primer servidor web</title>
</head>
<body>
  <h1>HOLA, mi primer servidor web</h1>
</body>
</html>

Para ejecutar nuestro servidor nos posicionamos dentro de nuestra carpeta mi-servidor-web y ejecutamos el siguiente comando:

$ node index.js;

Veremos este mensaje en nuestra consola:

Servidor web escuchando en el puerto 3000

Por último abrimos nuestro navegador web y obtendremos nuestro index.html como la imagen de abajo, utilizando http://localhost:3000 o http://localhost:3000/index.html:

Jaime Cervantes

29 thoughts on “¿Cómo crear un servidor web en 5 minutos con Node.js?

        1. Oh ya, pues hay varias plataformas de servicios en la nube, llamadas PaaS (Platform as a service), y que forma parte del término cloud computing, entre ellas se encuentran:

          – Google app engine
          – heroku
          – Amazon web services
          – Microsoft Azure

          Cada una tiene su propia manera de desplegar tu aplicación por lo que tendrías que ir a su documentación.

          También puedas rentar un servidor, un proveedor muy bueno es digital ocean, ahí debes configurar tu máquina servidor con nginx, para que este último funcione como servidor proxy y puedas tener accesible tu aplicación node.js montado en http://localhost:3000

  1. Hola, quiero probar mi aplicación web con el stack MEAN en mi red local, utilizo XAMPP para activar el frontend con angular pero el backend solo me funciona en mi PC,desde otra PC de la red no me carga los datos de la base de datos,que aplicacion me pudiera ayudar a desplegar el backend??

      1. Hola Jaime, gracias por la ayuda, pero no hay una solución para desplegar mi proyecto en una PC para ser vista desde la red local, sin tener que subirla a un servidor de internet, es que trabajo en un entorno empresarial,gracias de antemano.Saludos.

        1. Hola, solo necesitas node.js, levantas tu aplicación de node de igual forma que el ejemplo de esta publicación y en otra máquina desde un navegador apuntas a algo como

          http://192.168.1.79:3000

          Recuerda agregar el puerto que definiste en tu aplicación node.js con express, es decir:

          http://[ip]:[puerto]

          1. Hola Jaime, hice una aplicación siguiendo un curso online, la aplicación sirve para chat, la página te da la opción de decir quien eres y cual es tu mensaje, eso se agrega a un div y cuando refrescas debería aparecerle a todos. Hice la prueba como tu comentas con la ip local de mi equipo y el puerto que está escuchando en el servidor.
            El tema es el siguiente, desde los distintos navegadores en mi pc simultaneamente funciona perfecto, pero cuando pruebo desde mi celular (wifi, o sea misma red) y especifico la IP, la página se carga, sin embargo no envía los mensajes y no me da mucha opción para toquetear.
            No sé si me está faltando tirar abajo alguna cuestión de seguridad, o debería darme por satisfecho con el propósito de “prueba” que tiene esto.

            Mil gracias!

          2. Si! Exacto utilicé socket.io
            Bah, para ser preciso en mi respuesta, utilizo Express y ya con las pruebas hasta ahí no me funcionaba, luego utilicé socket.io para que un nuevo mensaje se propagara a todos los clientes conectados.

          3. En un principio debería funcionarte, cuando creas la instancia de socket.io le pasas la instancia de tu app de express para que escuche y se monte en la misma ip, por lo que debería de funcionar, así que sospecho del firewall, desactívalo y vuelve a probar.

          4. Es muy raro, yo había pensado que podía ser algo de eso y agregué Node a todas las excepciones.
            Quizás te sirva de pista, y ahora que lo pienso de pronto el problema está en mi móvil, puse un mensaje a consola cada vez que se dispara el evento connection:
            var io = require(‘socket.io’)(http);
            io.on(‘connection’, (socket) => {
            console.log(‘usuario conectado’);
            });
            Y cada vez que recargo la página en el movil o le doy a enviar mensaje me dispara la consola que un usuario se ha conectado, pero los mensajes no terminan de colar.

          5. De momento solo se me ocurre preguntar: ¿En qué parte de tu app en node.js estás escuchando los eventos que ocupas para la comunicación entre usuarios? De otra manera sin ver el código estoy a ciegas, ya sea que compartes código por aquí o agendemos una videollamada para poder ayudarte.

          6. Hice más pruebas, con la PC de mi mujer y su celular, en todos los casos la página se carga pero no pasa nada el intentar enviar los mensajes. Supongo que es probable que algo esté bloqueando esos métodos… pero no lo he podido encontrar.

          7. Si sospecho que no se están comunicando bien los sockets debido a algún error en la subscripción de los eventos y/o sus callbacks

          8. Pah Jaime, me vas a querer matar.
            Descubrí el error, y lo resolví jajaja un error super tonto, en las funciones que programé en el html para ejecutarse del lado cliente dejé “localhost” como parte de la URL… y por eso la aplicación solo funcionaba bien desde los clientes en el servidor.
            Muchísimas gracias por la ayuda y paciencia!!

          9. Diego!! naa, no te preocupes me alegra que hayas encontrado la solución y que tengas tu chat listo para usar 😀

      2. Hola Jaime, soy Carla, de ante mano gracias por la ayuda que me puedas dar, hice una aplicación con nodejs, mysql, en mi pc corre muy bien, pero cuando la subo a al servidor web no me funciona, la verdad nunca he instalado una aplicación a un servidor web, quizas estoy haciendo algo mal o quizás falte algo, espero tu pronta respuesta.

        1. Hola Carla, claro con mucho gusto te ayudo, ¿Dónde tienes tu servidor web?, ¿Tienes acceso a la máquina servidor para configurar node.js? ¿Qué tipo de servidor tienes, VPS o solo hosting?

          Necesito más información, por ejemplo, cuando es VPS normalmente necesitas un reverse proxy como nginx para que las peticiones a tu dominio/ip vayan a tu servidor node.js. Normalmente tú corres tu aplicación node.js en cierto puerto, supongamos el 3000, como se hizo en esta publicación, pero tienes que configurar un reverse proxy para que los usuarios desde un navegador puedan acceder con tu dominio https://miaplicacion.com y sin necesidad de indicar el puerto 3000 de tu aplicación node.js

  2. Hola tengo un front End que levanta la inf de files Csv con funciones javascript ahora me informaron que debo levantar la data de una BD Postgres que está en un server, pero no estoy pudiendo hacer la conexion estoy usando node.js pero nada. me podrias dar una mano que estoy haciendo mal.

    1. Hola Jor, te recomiendo que subas tu proyecto a un repositorio como github, bitbucket o gitLab, para poderle echar un ojo y ayudarte. En un principio no debería haber problema hacer conexión hay varios paquetes que ya hacen el trabajo por ti, por ejemplo, https://node-postgres.com/features/connecting#Programmatic, pero entiendo que siempre paso algo imprevisto, me pasa muchas veces, así que si me puedes dar acceso al código para resolverlo juntos, hasta podríamos agendar una videollamada y hacer pair programming.

  3. Hola amigo buena info, pero tengo un problema. Lo que pasa es que a mi servidor lo conecte con una base de datos mysql. En mi navegador local todo bien jala la info en JSON y me los muestra, pero cuando voy a otra pc de la misma red y accedo por la url http://192.168.1.42:3000(ejemplo) no me sale nada. Que crees que pueda estar pasando? Gracias de antemano

    1. Hola Alex, puede ser varias razones:

      • Asegúrate de que la ip y el puerto de tu aplicación node.js sean correctos
      • A veces puede dar problemas correr tu app con “localhost”, intenta utilizar tu ip para correr tu servidor web, ejemplo:
        • app.listen(80, '192.168.1.42', function () {
          console.log('Servidor web escuchando en el puerto 80');
          });
      • Investiga que tu router no tenga bloqueados ciertos puertos que te impidan acceder al puerto “3000” por ejemplo, podrías correr tu app en el puerto “80”
      • Revisa que el firewall de tu sistema operativo no este bloqueando a node.js
  4. Muy clara la explicaciòn. Me estoy iniciando en el backend y con los pocos conocimientos que tengo pude montar el servidor sin problemas. Estaba utilizando goormIDE pero tenìa la espinita de hacer mis pràcticas de manera local. Te agradezco.

  5. hola, espero puedas responder mi pregunta,
    tengo un dominio propio y lo que quiero es montar toda mi pagina web en un servidor propio, sin usar ningun servicio de terceros ni para alojamiento de pagina como tal ni para las db y obviamente que pueda ser accedida desde toda la web

    1. Hola Carlos, disculpa el retraso, mucho trabajo y la familia, ya sabes. La verdad que no tengo mucho conocimiento, nunca lo he hecho, pero los conceptos los entiendo. Te explico.

      Existen dos opciones, tener una IP estática o un servicio de DNS dinámico.

      IP estática. Los proveedores de Internet ISP usan IP dinámicas para sus clientes, para ellos es un menor costo y más alcance de usuarios. Es por eso que necesitas pagarles porque te den una IP estática.

      Servicio de DNS dinámico. Existe servicios gratuitos que te permiten asignar un dominio para tu servidor, y aunque tu IP cambie, este servicio actualiza la IP y tus usuarios siempre podrán acceder a tu servidor. Estos servicios tiene siempre una opción gratuita con sufijos de dóminos limitados, si quieres un dominio más personalizado, entonces es cuando empiezan a tener un costo. Proveedores de estos servicios pueden ser:

      1. https://www.changeip.com/dns.php
      2. https://www.noip.com/free
      3. https://www.dynu.com/
      4. https://www.oracle.com/corporate/acquisitions/dyn/
      5. https://support.google.com/domains/answer/6147083
      6. https://freedns.afraid.org/

      Espero esto te sirva de algo amigo, cuídate mucho.

Deja un comentario

Salir de la versión móvil