Crea tu servidor Node
Sigamos adelante y vamos a ver el modo de configurar un servidor node HTTP para que podamos mandar archivos HTML entre otros, a nuestros usuarios. En la entrada anterior, solo vimos algunas cosillas por consola. En esta entrada vamos a aplicar lo aprendido un paso más allá para que podamos «servir» una página web a nuestros usuarios. Estaremos un paso más cerca de hacer aplicaciones web hechas y derechas, pero antes crea tu servidor node con uno de estos métodos:
Método 1. Puro Node (sin Express): Es un modo sencillo de crear nuestro servidor y solo usaremos este método para conocer como hacerlo con Node barebones. Después de esto usaremos exclusivamente el método Express (método 2).
Método 2: Usando Express. Express es una de las cuatro partes principales del stack MEAN, queremos usar este método. Y una vez aprendas este método seguramente no querrás echar la vista hacia atrás.
Aplicación de ejemplo
En este ejemplo enviaremos un archivo HTML a nuestro navegador usando el Método1 y el Método 2. Para empezar necesitamos una nueva carpeta con los siguientes archivos:
- package.json
- server.js
- index.html
Como aprendimos anteriormente, package.json mantendrá la configuración/packages para nuestro proyecto mientras server.js tendrá nuestra app a punto y configurada. Nuestro archivo index.html será un archivo HTML básico. package.json e index.html serán los mismos para ambos métodos. El único archivo que cambiará entre los dos métodos es el server.js, porque aquí es donde iniciamos nuestro servidor Node.
package.json
Nuestro package.json sencillo:
1 |
{<br> "name": "http-server",<br> "main": "server.js",<br>}<br> |
index.html
Creamos otro archivo HTML que hará de index:
Método 1: Node puro (sin Express)
Cuando usamos el Método 1, nos bajaremos dos módulos que están integrados en el propio Node. El módulo HTTP que se usa para iniciar los servidores (servers) HTTP y responder a peticiones (requests) HTTP de los usuarios. El módulo fs (file system) se usa para leer el sistema de archivo. Necesitaremos leer nuestro index.html del sistema de archivos y después pasárselo a nuestro usuario usando un servidor HTTP.
El server.js del Método 1 tiene el siguiente código:
1 2 3 |
//iniciamos los módulos http y filesystem var http = require('http'), fs = require('fs'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//creamos el objeto de nuestro servidor usando el módulo http http.createServer(function(req, res){ //preparamos las cabeceras de respuesta res.writeHead({ 'Content-Type': 'text/html', 'Access-Controll-Allow-Origin': '*' }); //cogemos el archivo index.html usando fs var readStream = fs.createReadStream(__dirname + '/index.html'); //enviamos el index.html a nuestro usuario readStream.pipe(res); }).listen(1337); |
1 2 |
//nos decimos a nosotros mismo qué está pasando console.log('Visitame en http://localhost:1337') |
Estamos usando el módulo http para crear un servidor y el módulo fs para coger un archivo index y enviárselo como respuesta al usuario.
Con nuestro server.js definido, vamos a la consola e iniciamos nuestro servidor node http.
nodemon server.js
Deberías ver tu servidor iniciándose y el mensaje que escribimos en la consola:
Ahora podemos ver nuestro sitio en el navegador si ponemos en la barra–> http://localhost:1337
Por fin hemos enviado un archivo HTML a nuestros usuarios. Pensarás que la creación de este servidor http lleva por delante cierta sintaxis que te costará recordar. No te preocupes, el método Express es mucho más claro.
Método 2: Usando Express
Ahora que hemos arrancado un servidor usando el módulo HTTP, vamos hacer lo mismo con Express. Ya verás que es mucho más sencillo gestionar tu código.
Añadiremos primero Express a este proyecto. Vamos a usar la consola para instalarlo y guardarlo en nuestro package.json:
npm install express –save
Ahora cambiamos el archivo server.js para acomodar a Express. Empezaremos llamando a Express. Usando esa instancia de Express, definiremos una ruta y enviaremos el archivo index.html. Después «escucharemos» en cierto puerto para la petición del navegador.
1 2 3 4 |
//cargamos el package express y creamos nuestra app var express = require('express'); var app = express(); var path = require('path'); |
1 2 3 4 |
//enviamos nuestro archivo index.html al usuario como página de inicio app.get('/', function(req, res){ res.sendFile(path.join(__dirname + '/index.html')); }); |
1 2 3 |
//iniciamos el servidor app.listen(1337); console.log('¡1337 es un puerto maravilloso!'); |
Ya hemos cargado Express, establecido un puerto, y arrancado nuestro servidor. Express ha hecho el trabajo de arrancar un servidor mucho más sencillo y de sintaxis limpia. Al arrancar el servidor usando nodemon server.js escupirá nuestro archivo HTML a los usuarios en el http://localhost:1337 una vez más.
Veremos el mismo resultado que antes pero ahora tenemos un código más legible:
Y eso es todo, pero la cosa sigue, es hora de hacer routing con Nodejs y Express 😀
Antes de nada, muchas gracias por esta serie de entradas las cuales son de gran ayuda.
Queria comentaros que he hecho el paso 1, para arrancar el servidor con node sin express y no hay manera de echarlo a andar. Todo va bien hasta que al intentar a http://localhost:1337 la consola me imprime esto:
C:\Users\Jose\Desktop\test-guay-2>nodemon server.js
[nodemon] 1.10.0
[nodemon] to restart at any time, enter
rs
[nodemon] watching: *.*
[nodemon] starting
node server.js
Visitame en en http://localhost:1337
_http_server.js:192
throw new RangeError(
Invalid status code: ${statusCode}
);^
RangeError: Invalid status code: 0
at ServerResponse.writeHead (_http_server.js:192:11)
at Server. (C:\Users\Jose\Desktop\test-guay-2\server.js:9:6)
at emitTwo (events.js:87:13)
at Server.emit (events.js:172:7)
at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:533:12)
at HTTPParser.parserOnHeadersComplete (_http_common.js:103:23)
[nodemon] app crashed – waiting for file changes before starting…
¿Alguien sabe porque ocurre esto?
const http = require(‘http’);
const fs = require(‘fs’);
http.createServer((request, response) => {
response.writeHead(200, {
‘Content-Type’: ‘text/html’,
‘Access-Controll-Allow-Origin’: ‘*’
});
let readStream = fs.createReadStream(__dirname + «/index.html»);
readStream.pipe(response);
}).listen(1337);
console.log(«http://localhost:1337»);
Faltaría poner el starus code al hacer writeHead En este caso el codigo 200 de todo va OK.