Para crear un servidor web en 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 máquina (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 esté 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 TCP y http, 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
:
Esta aplicación así de sencilla, como se puede compilar o deployar para montarla en mi servidor local?
A lo mejor no te estoy entendiendo. ¿A qué te refieres exactamente? En este pequeño ejemplo tenemos el servidor local, express.js lo genera internamente, es por eso que podemos acceder a través de http://localhost:3000.
Si le entiendo bien lo que el desea es poner su aplicacion en un servicio tal como app.com con los archivos compilados..
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:
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
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??
Hola Felix, aquí hay una guía paso a paso para que subas tu aplicación a heroku con node.js, es totalmente gratis:
https://devcenter.heroku.com/articles/getting-started-with-nodejs
Para la base de datos con mongo te recomiendo estas plataformas que tienen servicio gratuito:
https://mlab.com/
https://www.mongodb.com/
Si necesitas más detalles dime, sin problemas te ayudo 😀
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.
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]
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!
Hola Diego, ¿Para el chat ocupaste socket.io o algo similar?
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.
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.
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.
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.
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.
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
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!!
Diego!! naa, no te preocupes me alegra que hayas encontrado la solución y que tengas tu chat listo para usar 😀
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.
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
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.
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.
Muchas Gracias,Muy útil la información
De nada Dani Diaz, me alegra que te sea de ayuda 😀
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
Hola Alex, puede ser varias razones:
<
ul>
app.listen(80, '192.168.1.42', function () {
console.log('Servidor web escuchando en el puerto 80');
});
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.
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
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:
Espero esto te sirva de algo amigo, cuídate mucho.
Buenas Noches, una consulta he hecho una aplicacion en node js y en mi red local funciona correctamente, en la misma pc o desde otra pc de la red. Tengo una IP Publica y y en el router hice un NAT de mi IP PUBLICA del puerto 3000 a la IP PRIVADA con puerto 3000, crei que solo seria hacer eso y que me levantaria mi aplicacion colocando mi http://IP_PUBLICA:3000 pero no sale nada. Ojala con tu experiencia me de una mano. Gracias.
Hola Hector, la verdad es que no tengo mucha experiencia en estas configuraciones de redes, lo que recuerdo vagamente de unas clases en la universidad es que había configuraciones de NAT, puertos y DMZ.
También tu ip pública puede ser estática y dinámica, por ejemplo en mi caso tengo en casa el proveedor de internet TELMEX infinitum, con ellos mi IP es dinámica, cada cierto tiempo cambia mi IP pública. Por lo que cuando una ip es dinámica, tienes que obtener una dirección estática mediante servicios como los de:
Si necesitas ayuda, contáctame y nos ponemos a investigar juntos. Si lo deseas hacer en “solo”, estaría muy padre que compartieras ese conocimiento con nosotros, ya sea a través de una publicación o aquí directo en los comentarios.
Hola, muchas gracias por la explicación. Sin embargo sale un error CANNOT GET, copié exactamente el código para el index.js.
Gracias
No se ustedes, pero node es un software que le quita toda la ventaja a javascript. Puede ser muy poderoso pero no tiene razón para ser, porque javascript es realmente muy utilizado por que lo podemos llevar a casi cualquier entorno. Hay televisores o neveras que tienen un navegador y en ellos soportan javascript, luego si haces una aplicación también funciona en esos dispositivos, pero node es como trarar de montar bicicleta sin ruedas. Por donde se le instala el node a la nevera?? Y de por si ya las aplicaciones de javascript son geniales porque funcionan donde otras no lo hacen, ponerle una trampa a javascript me parece que no da muchas ventajas y si se las quita a javascript.