En aquest tema, aprendrem com gestionar peticions i respostes en un servidor HTTP creat amb Node.js. Aquest és un aspecte fonamental per a qualsevol aplicació web, ja que permet la comunicació entre el client (navegador web) i el servidor.
Conceptes Clau
- HTTP: Protocol de Transferència d'Hipertext, utilitzat per a la comunicació entre clients i servidors.
- Petició HTTP: Sol·licitud enviada pel client al servidor, que pot incloure mètodes com GET, POST, PUT, DELETE, etc.
- Resposta HTTP: Resposta enviada pel servidor al client, que inclou un codi d'estat, capçaleres i un cos de resposta.
Crear un Servidor HTTP
Primer, crearem un servidor HTTP bàsic que pugui gestionar peticions i enviar respostes.
Exemple de Codi
const http = require('http'); // Crear un servidor HTTP const server = http.createServer((req, res) => { // Establir l'estatus de la resposta i el tipus de contingut res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); // Enviar la resposta res.end('Hola, món!\n'); }); // El servidor escolta en el port 3000 server.listen(3000, '127.0.0.1', () => { console.log('Servidor en funcionament a http://127.0.0.1:3000/'); });
Explicació del Codi
- Importar el mòdul
http
: Utilitzemrequire('http')
per importar el mòdul HTTP de Node.js. - Crear el servidor: Utilitzem
http.createServer()
per crear un servidor HTTP. Aquesta funció pren un callback que s'executa cada vegada que el servidor rep una petició. - Gestionar la petició i la resposta: Dins del callback, establim l'estatus de la resposta (
res.statusCode = 200
) i el tipus de contingut (res.setHeader('Content-Type', 'text/plain')
). Finalment, enviem la resposta ambres.end('Hola, món!\n')
. - Escoltar en un port: Utilitzem
server.listen(3000, '127.0.0.1')
per fer que el servidor escolti en el port 3000.
Gestionar Diferents Tipus de Peticions
Podem gestionar diferents tipus de peticions (GET, POST, etc.) utilitzant la propietat req.method
.
Exemple de Codi
const http = require('http'); const server = http.createServer((req, res) => { if (req.method === 'GET') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Has fet una petició GET\n'); } else if (req.method === 'POST') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Has fet una petició POST\n'); } else { res.statusCode = 405; res.setHeader('Content-Type', 'text/plain'); res.end('Mètode no permès\n'); } }); server.listen(3000, '127.0.0.1', () => { console.log('Servidor en funcionament a http://127.0.0.1:3000/'); });
Explicació del Codi
- Comprovar el mètode de la petició: Utilitzem
req.method
per determinar el tipus de petició (GET, POST, etc.). - Gestionar GET i POST: Si la petició és GET, enviem una resposta amb el missatge "Has fet una petició GET". Si és POST, enviem "Has fet una petició POST".
- Gestionar altres mètodes: Si la petició no és ni GET ni POST, enviem una resposta amb el codi d'estat 405 (Mètode no permès).
Gestionar Peticions amb Rutes
Podem gestionar diferents rutes utilitzant la propietat req.url
.
Exemple de Codi
const http = require('http'); const server = http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Pàgina d\'inici\n'); } else if (req.method === 'GET' && req.url === '/sobre') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Pàgina sobre nosaltres\n'); } else { res.statusCode = 404; res.setHeader('Content-Type', 'text/plain'); res.end('Pàgina no trobada\n'); } }); server.listen(3000, '127.0.0.1', () => { console.log('Servidor en funcionament a http://127.0.0.1:3000/'); });
Explicació del Codi
- Comprovar la ruta de la petició: Utilitzem
req.url
per determinar la ruta de la petició. - Gestionar diferents rutes: Si la petició és GET i la ruta és
/
, enviem una resposta amb el missatge "Pàgina d'inici". Si la ruta és/sobre
, enviem "Pàgina sobre nosaltres". - Gestionar rutes no trobades: Si la ruta no coincideix amb cap de les anteriors, enviem una resposta amb el codi d'estat 404 (Pàgina no trobada).
Exercicis Pràctics
Exercici 1: Crear un Servidor HTTP amb Diferents Rutes
- Crea un servidor HTTP que gestioni les següents rutes:
/
(GET): Respon amb "Benvingut a la pàgina d'inici"./contacte
(GET): Respon amb "Pàgina de contacte"./productes
(GET): Respon amb "Llista de productes".- Qualsevol altra ruta: Respon amb "Pàgina no trobada" i el codi d'estat 404.
Solució
const http = require('http'); const server = http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Benvingut a la pàgina d\'inici\n'); } else if (req.method === 'GET' && req.url === '/contacte') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Pàgina de contacte\n'); } else if (req.method === 'GET' && req.url === '/productes') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Llista de productes\n'); } else { res.statusCode = 404; res.setHeader('Content-Type', 'text/plain'); res.end('Pàgina no trobada\n'); } }); server.listen(3000, '127.0.0.1', () => { console.log('Servidor en funcionament a http://127.0.0.1:3000/'); });
Exercici 2: Gestionar Peticions POST
- Modifica el servidor anterior per gestionar peticions POST a la ruta
/contacte
. La resposta ha de ser "Formulari de contacte enviat".
Solució
const http = require('http'); const server = http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Benvingut a la pàgina d\'inici\n'); } else if (req.method === 'GET' && req.url === '/contacte') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Pàgina de contacte\n'); } else if (req.method === 'POST' && req.url === '/contacte') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Formulari de contacte enviat\n'); } else if (req.method === 'GET' && req.url === '/productes') { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Llista de productes\n'); } else { res.statusCode = 404; res.setHeader('Content-Type', 'text/plain'); res.end('Pàgina no trobada\n'); } }); server.listen(3000, '127.0.0.1', () => { console.log('Servidor en funcionament a http://127.0.0.1:3000/'); });
Resum
En aquesta secció, hem après com gestionar peticions i respostes en un servidor HTTP creat amb Node.js. Hem vist com gestionar diferents tipus de peticions (GET, POST) i com treballar amb diferents rutes. Aquests conceptes són fonamentals per a la creació d'aplicacions web amb Node.js. En el següent tema, explorarem com servir fitxers estàtics des del nostre servidor.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu